では、Studentクラスに新たな属性を追加してみよう。Studentクラスに何が必要だろうかと考えて、ここではシンプルに学校名をインスタンス変数schoolとして追加することにしよう。インスタンス変数に値を設定するには、もちろん__init__メソッドを定義すればよい。つまり、Studentクラスのインスタンスを生成するには、名前と年齢、学校名の3つの引数を指定する必要があるということだ。これら(とインスタンス自身を参照するself)が__init__メソッドのパラメーターとなる。年齢と同様に、学校名を取得するメソッドも追加しておこう。実際のコードは次のようになる。
class Student(Person):
def __init__(self, name, age, school):
self.name = name
self.age = age
self.school = school
def get_school(self):
return self.school
ここでは、StudentクラスでPersonクラスにもある(さらにいえば、objectクラスにもある)__init__メソッドを定義しているが、このように基底クラスで定義されているものと同名のメソッドを派生クラスで定義することを「メソッドをオーバーライド(上書き)する」という。
__init__メソッドをオーバーライドするときに注意したいのは、「Student(……)」のようにしてStudentクラスのインスタンスを生成すると、Pythonによって__init__メソッドが自動的に呼び出されるが、この際に基底クラスであるPersonクラスの__init__メソッドは呼び出されなくなってしまう点だ(他のプログラミング言語では、派生クラスのインスタンスを生成すると、芋づる式に基底クラスの「コンストラクタ」が呼び出される仕組みになっているものが多いが、Pythonではそうはなっていない)。
簡単にいうと、Personクラスの__init__メソッドで行っていたインスタンスの初期化処理は行われなくなってしまうということだ。そのために上では、Personクラスのインスタンス変数とStudentクラスのインスタンス変数の3つを初期化するようになっている。
簡単なプログラムであればこのようにしても問題ないが、基底クラスの__init__メソッドで複雑な処理をしていて、それを省略してしまうことに問題がある場合などには、「派生クラスの__init__メソッド内部で基底クラスの__init__メソッドを明示的に呼び出す」ようにする。これにはsuper関数を引数なしで呼び出すことで、基底クラスのメソッドにアクセスできるようになる。
super()
super関数を呼び出しているクラスの基底クラスのメソッドにアクセス可能にするオブジェクトを返す。
これを使うと先ほどのコードは次のように書ける。
Copyright© Digital Advantage Corp. All Rights Reserved.