連載
» 2019年08月09日 05時00分 公開

Python入門:[Python入門]クラスの継承 (2/2)

[かわさきしんじ,Deep Insider編集部]
前のページへ 1|2       

派生クラスに属性を追加する:メソッドのオーバーライド

 では、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

Personクラスの属性に加えて、schoolという属性を持つようにしたStudentクラス

 ここでは、StudentクラスでPersonクラスにもある(さらにいえば、objectクラスにもある)__init__メソッドを定義しているが、このように基底クラスで定義されているものと同名のメソッドを派生クラスで定義することを「メソッドをオーバーライド(上書き)する」という。

 __init__メソッドをオーバーライドするときに注意したいのは、「Student(……)」のようにしてStudentクラスのインスタンスを生成すると、Pythonによって__init__メソッドが自動的に呼び出されるが、この際に基底クラスであるPersonクラスの__init__メソッドは呼び出されなくなってしまう点だ(他のプログラミング言語では、派生クラスのインスタンスを生成すると、芋づる式に基底クラスの「コンストラクタ」が呼び出される仕組みになっているものが多いが、Pythonではそうはなっていない)。

 簡単にいうと、Personクラスの__init__メソッドで行っていたインスタンスの初期化処理は行われなくなってしまうということだ。そのために上では、Personクラスのインスタンス変数とStudentクラスのインスタンス変数の3つを初期化するようになっている。

 簡単なプログラムであればこのようにしても問題ないが、基底クラスの__init__メソッドで複雑な処理をしていて、それを省略してしまうことに問題がある場合などには、「派生クラスの__init__メソッド内部で基底クラスの__init__メソッドを明示的に呼び出す」ようにする。これにはsuper関数を引数なしで呼び出すことで、基底クラスのメソッドにアクセスできるようになる。

super関数

super()


 super関数を呼び出しているクラスの基底クラスのメソッドにアクセス可能にするオブジェクトを返す。


 これを使うと先ほどのコードは次のように書ける。

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。