Python学習【365日チャレンジ!】77日目のマスターU(@Udemy11)です。
7が並ぶと嬉しくなりますね。777までの継続予定はありませんが、333の数字が揃う日は来る予定ですので、先は長いですが、しっかりとPython学習を継続していきたいと思います。
それではさっそくPython学習をはじめましょう!
昨日の復習
昨日は、クラスの定義について学習しました。
例えるなら、クラスが人で、人に動作(メソッド)を教えるという感じですね。
class Person(object):
def sing(self):
print('We are the world')
person = Person()
person.sing()
出力結果
We are the world
メソッドには(self)
を入れておく必要がありました。
また、(object)
は、あってもなくてもPython3では問題ありませんが、後ほど学習するクラスの継承で必要になるということでした。
それでは本日の学習をはじめていきましょう!
クラスの初期化
以前、フォルダを作成する際には、最初に読み込まれるファイルである__init__.py
が必須で、__init__.py
に__all__ = [モジュール(ファイル名)のリスト]
を記述して、フォルダ内のモジュールをリスト化しておけば、*
でフォルダ内のフモジュールをすべて読み込むことができました。(*
でのimport
は非推奨)
クラスにも同じような感じで、最初に読むこむモジュールとして、__init__
を記述することでクラスを初期化(initialize)することができます。
酒井さんの講座の中では、init
はイニットと呼ばれていたので、イニシャライズの意味であるとは考えていなかったのですが、よくよく考えるとinitialize
の省略したものだったんですね。
ということで、クラスの初期化は__init__
を使ってみましょう。
class Person(object):
def __init__(self):
print('First')
person = Person()
出力結果
First
感覚としては、__init__()
が実行されていないので、First
は出力されないような気がしますが、クラスが実行されたときに最初に__init__
が実行され、初期化処理をするので、First
が出力されます。
続いて、初期化処理で自分自身に名前をつけてみます。
class Person(object):
def __init__(self):
self.name = 'Mark'
def cry(self):
print('{} said "Oh my god!"'.format(self.name))
person = Person()
person.cry()
出力結果
Mark said ”Oh my god!"
昨日は有耶無耶にして、メソッドにはself
を入れておくと説明していたself
は、自分自身という意味で、3行目のself.name
は、自分自身の名前ということになります。
つまり2-3行目で、自分自身の名前をMark
にinitialize
しているわけです。
最初に自分の名前をつけているので、次の関数でも自分の名前をself.name
で使うことができ、以前学習したformat
メソッドで文章に名前を入れて、cry()
で出力しています。
クラスのメソッドは、self
がなければ、自分自身のことがわからなくなってしまうので、self
を必ず指定する必要があります。
initに引数を加える
__init__
でクラスを初期化するわけですが、引数を指定することも可能です。
すでに説明したようにself
は必ず必要なので、self
のあとに続けて引数を記述します。
class Person(object):
def __init__(self, name):
self.name = name
def cry(self):
print('{} said "Oh my god!"'.format(self.name))
person = Person('Jonson')
person.cry()
出力結果
Jonson said ”Oh my god!"
引数をname
にして、8行目でJonson
という値を与えています。
この場合は、Person()
の実行時に値を入れないとエラーが起こります。
また、通常の関数同様、2行目でname='Jack'
とデフォルト値を入れておけば、実行時に引数の値が空でも問題なく実行されます。
他のメソッドでも活用可能
クラスの中で定義したメソッドは、クラス内の他のメソッドでも活用することができます。
class Person(object):
def __init__(self, name='Kent'):
self.name = name
def say_hello(self):
print('I am {}. Hello'.format(self.name))
self.sing(3)
def sing(self, num):
print('Yes!' * num)
person = Person()
person.say_hello()
出力結果
I am Kent. Hello
Yes!Yes!Yes!
すでに学習した内容に加えて、一つYes
を引数num
回数分繰り返すsing
メソッドを追加しました。
__init__
による初期化で指定したself.name
を利用して文章を出力するメソッドsay_hello
に、7行目で、追加したメソッドsing
の引数num
に3
を代入した実行を加えています。
この状態でperson.say_hello()
を実行すれば、文章の出力のあと、sing
メソッドも、引数num
に3
を代入して実行されるということです。
モジュールもクラスも構造が同じ
モジュール(ライブラリ)内のメソッドを他のメソッドから読み込むことが可能で、クラスもクラス内のメソッドを他のメソッドから読み込むことが可能です。
つまり、構造的には同じような感じだということです。
person.say_hello()
単体で考えると、
person.py
内のsay_hello
関数
とみることができるし、
person
クラス内のsay_hello
メソッド
と捉えることもできます。
両方とも同じ呼び出し方なので、実行コード単体だけだとどちらかはわかりません。
新しいことを学習したときは、すでに知っていることとの共通点を見つけて、つなげることで、忘れにくくなるので、ぜひ試してみてください。
これからどんどん複雑になっていくので、思考停止状態にならないように、頭を柔らかくしながら、学習を進めていきたいと思います。
それでは、明日もGood Python!