アカデミック

【第14回 クラス】元文系京大生による超初心者向けPython入門講座

本記事は,python入門講座シリーズの内容になります。その他の記事は,こちらの「Python入門講座/実践講座まとめ」をご覧ください。ターゲットは主にpythonを使ったことがない人向けで,簡潔で分かりやすい説明を心がけています。

内容に誤りがありましたら,ご指摘いただけますと非常に助かります。

読みたい場所へジャンプ!

今回のお題

クラスを作れるようになろう!
オブジェクト指向についても少し雰囲気が分かると最高です!

もしかすると,今回から少し難しく感じるかもしれません。しかし,身構える必要は全くなく,今回お伝えするポイントさえおさえてしまえば楽々と理解できるようになるはずです。

 

写経

まずは,上の写真と同じ内容をセルに書き込んで,実行(Shift+Enter)してみてください。

 

ポイント

class MusicalInstrument:
  
  def __init__(self, name):

  def info_piano(self):

  def info_drams(self):

# ↑↑classってナニ??
# ↑↑__init__ってナニ??
# ↑↑selfってナニ??

今回のポイントは,初学者の方がつまづきやすいクラスに関してです。

 

解説

今回のお話の流れを最初に確認させてください。まずは,クラスという考えを説明した後に,インスタンスという言葉について説明します。その後に,オブジェクト指向という考え方を確認して,__init__とselfについてお伝えしていきます。それでは,さっそく始めていきましょう。

Pythonには限らないのですが,クラスというのはよく設計図に例えられます。少し抽象度の高い話になってしまうのですが,プログラミングでは秩序を保ちながら新しい変数(箱のこと)を生み出して,分かりやすいコードで効率的な作業を行います。秩序というのは,包含関係(ヒナタは日向一族)や機能の上下関係(ヒナタは白眼を使える)のことを指します。

秩序を保つためには,かたまりや集合を表す概念が必要になり,クラスと名付けられたのです。そして,クラスに基づいて生成されたモノをインスタンスと呼びます。プログラミングという世界では,複数のクラスに従った住人しか生きることを許されないのです。このような考え方を,秩序を保ちながらモノ(オブジェクト)を作り出す考えから,オブジェクト指向と呼びます。

設計図(クラス)の作り方にも,決まりがあります。例えば,__init__という名前の関数は,設計図(クラス)に従ってモノ(インスタンス)が作られたときに呼び出される関数です。

ちなみに,クラス内の関数をメソッドと呼びます。ですので,__init__という関数はクラス共通のメソッドということになります。また,このメソッドを特に「コンストラクタ」と呼びます。

 

他にも,設計図(クラス)内で定義されるメソッドの最初の引数はselfにすることが推奨されています。

 

なにselfって??

 

いきなりselfなんてものが出てきて混乱してしまうと思いますが,設計図(クラス)に従ってモノ(インスタンス)を作ったときに,先ほどは__init__が呼び出されるという話をしましたが,実はselfにそのモノ自体が代入されてしまうのです。

メソッドが呼び出されたときにもselfにインスタンスが代入されます。

 

少しずつ,コードを確認していきましょう。

# この1文でクラス(設計図)を作り出します
class MusicalInstrument:

クラス作りますよ,という宣言みたいなものです。

 

  # この関数が最初に呼び出されます
  def __init__(self, name):
    print("今から楽器の情報をお伝えします!")

  # selfにはインスタンスが代入されていますので
  # selfのnameという情報は2番目の引数であるnameである
  # ということを言っています
    self.name = name

出ました。__init__関数は一番最初に呼び出される関数ですので,今回の例でMusicalInstrumentというクラスからinstrumentというオブジェクトを生成したときに「今から楽器の情報をお伝えします!」と出力されていますね。また,self.name = nameというのはinstrumentというオブジェクトに情報を付け加えていることを表しています。Instrumentの名前は,設計図に渡された名前にセットしますねという意味です。

 

  # 設計図に従って作り出されたモノが使えるメソッドです
  def info_piano(self):
    self.cost = 300000
    self.feature = "elegant"

  # もし呼び出したモノがピアノでなければ注意書きを表示します
    if self.name != "piano":
      print("ご希望の楽器とは異なる情報です。")
    return [self.cost, self.feature]

info_pianoというメソッドは,呼び出したインスタンスにピアノの情報を付け加えるような機能を持っています。ですので,もしピアノという名前を持たないインスタンスに呼び出されたときは,注意書きを出力するように設定しています。

 

  # info_pianoと同じようなメソッドです
  def info_drams(self):
    self.cost = 200000
    self.feature = "rythmical"
    if self.name != "drams":
      print("ご希望の楽器とは異なる情報です。")
    return [self.cost, self.feature]

info_pianoのドラム版がinfo_dramsです。

 

instrument = MusicalInstrument("piano")
[cost, feature] = instrument.info_piano()

今回のお題のメイン部分がこちらの2行です。最初の行で,MusicalInstrumentという設計図に従ってinstrumentというインスタンスを生成しています。また,そのときにインスタンスの名前情報に”piano”をセットしています。次の行で,生成したインスタンスにピアノに関する情報を,さらに付け加えています。そして,返ってくる2つの情報をcostとfeatureに代入しています。

 

print(instrument.name)
print(cost)
print(feature)

得られた情報を表示しています。

 

instrument.info_drams()

ドラムの情報を付け加えようとすると,注意書きが表示されます。

ABOUT ME
zuka
京都大学で機械学習を学んでいます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

※ Please enter your comments in Japanese to prevent spam.