Python クラスの初期化とクラス変数

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行目で、自分自身の名前をMarkinitializeしているわけです。

最初に自分の名前をつけているので、次の関数でも自分の名前を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の引数num3を代入した実行を加えています。

この状態でperson.say_hello()を実行すれば、文章の出力のあと、singメソッドも、引数num3を代入して実行されるということです。

モジュールもクラスも構造が同じ

モジュール(ライブラリ)内のメソッドを他のメソッドから読み込むことが可能で、クラスもクラス内のメソッドを他のメソッドから読み込むことが可能です。

つまり、構造的には同じような感じだということです。

person.say_hello()単体で考えると、

person.py内のsay_hello関数

とみることができるし、

personクラス内のsay_helloメソッド

と捉えることもできます。

両方とも同じ呼び出し方なので、実行コード単体だけだとどちらかはわかりません。

新しいことを学習したときは、すでに知っていることとの共通点を見つけて、つなげることで、忘れにくくなるので、ぜひ試してみてください。

これからどんどん複雑になっていくので、思考停止状態にならないように、頭を柔らかくしながら、学習を進めていきたいと思います。

それでは、明日もGood Python!