Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
6. オブジェクトとクラス
6.3 継承
コーディング上の問題解決において、既存のクラスで必要なことを殆どしてくれるオブジェクトが作成できる際に便利なのが継承である。すなわち使いたい既存のクラスを指定し、追加ないし変更したい一部のみを定義した新しいクラスを作る。これによりメンテナンスしなければならないコードを省略できる。
こうして継承した新たなクラスでは、古いクラスの動作は使われない(オーバーライド)。
######################################################### ### Carクラスを定義し、それを元にサブクラスYugoを定義 ### ######################################################### # クラスの定義 class Car(): def __init__(self,size): self.size = size class Yugo(Car): def __init__(self,size): super().__init__(size) self.size = size + ' Car' def exclaim(self): print("I'm a Yugo! Much like a Car, but more Yugo-ish.") # オブジェクトの定義 give_me_a_car = Car('Big') give_me_a_yugo = Yugo('Big') print(give_me_a_car.size) print(give_me_a_yugo.size) give_me_a_yugo.exclaim()
6.3.1 superによる親への支援要請
子クラスが親クラスのメソッドを呼び出すには、親クラスのメソッドをで明示的に呼び出す必要がある。上の例では、以下のように動いている:
- が親クラスのの定義を呼び出す。
- __メソッド呼び出しは、__メソッドを呼び出す。このとき引数の親クラスへの受け渡しは自動的に行われる。
- はにはない新しいコードで、これにより親クラスと差別化されている。
新しいクラスを定義せず、敢えてオーバーライドさせたのは、親クラスにおける変更がそのまま子クラスに反映されるというメリットがあるからである。
*1:第2版が出ているものの初版しか持っていないのでこちらで。