【Python】Class内にあるinitやsuperの使い方【サンプルあり】

どーも、ぐるたか@guru_takaです。

PythonのClassで頻出するinitやsuperについて、簡単にまとめました。初学者の参考になれば幸いです。

サンプルコード

サンプルコードに沿って、進めていきます。

python
class Human:
    def __init__(self,name):
        self.name = name

class Greet(Human):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age
    
    def hello(self):
        print(self.name, 'さん こんにちは!')

greet = Greet('gurutaka',50)

greet.name, greet.age
>>> ('gurutaka', 50)

greet.hello()
>>> gurutaka さん こんにちは!

initについて

__init__は、インスタンス化したときに、一度だけ呼び出される関数です。コンストラクタといいます。

初期化の処理というイメージでOKです!

以下のようにHumanクラスをインスタンス化すると、__init__内の処理が動きます。そして、プロパティ'name'に”ぐるたか”が入るのです。

Python
 human = Human('ぐるたか')

human.name
>>> ぐるたか

superについて

Superは継承で使います。継承とは、他で定義したクラスを引き継ぐことを意味します。最初に紹介したサンプルコードでは、Greetクラス(子)がHumanクラス(親)を引き継いでいます。

コードの書き方はシンプルで、Greet(Human)のように、クラスを定義する際に継承したいクラスを引数に渡すだけです!

ただ、このままでは継承元である親クラス(Human)のコンストラクタは定義されません。ここでsuper関数が登場します!

super().メソッド名()と記述することで、継承元のメソッドを呼び出せます。

なので、サンプルコードのように、super().__init__(name)と書けば、継承元のコンストラクタを定義できます。

すると、サンプルコードのように、Greetクラス(子)をインスタンス化すると、コンストラクタで定義されたHumanクラス(親)のnameが使えるようになります!

MEMO
Python2ではsuper(Greet, self).__init__(name)と書く必要がありましたが、Python3からsuper().__init__(name)と省略できるようになりました。

参考リンク

参考 Python の super() 関数の使い方Life with Python

コメントを残す