鉄は熱いうちに打て
=============================
Effective Pythonで学ぶ - 3章 クラスと継承 2¶
2017-12-06
昨日までのあらすじ¶
Effective Python を真面目に読もうと思ったので読みはじめました。
3章 クラスと継承¶
項目 24:@classmethodポリモルフィズムを使ってオブジェクトをジェネリックに構築する
項目 25:親クラスを superを使って初期化する

実行してみて謎なことが。こんなものなの?
class GrandPa:
def __init__(self):
print('おじいちゃん')
class Papa(GrandPa):
def __init__(self):
super().__init__()
print('パパ')
class Boku(Papa):
def __init__(self):
super().__init__()
print('僕')
boku = Boku()
実行すると、こんな感じ
おじいちゃん
パパ
僕
別系統のママを足す
class GrandMa:
def __init__(self):
print('おばあちゃん')
class Mama(GrandMa):
def __init__(self):
super().__init__()
print('ママ')
class Boku(Papa, Mama):
def __init__(self):
super().__init__()
print('僕')
boku = Boku()
実行すると、こんな感じ
おじいちゃん
パパ
僕
ママの方は実行されない。多重継承して、同じメソッドがあると左側が優先されるらしい。
しかし、ママもおじいちゃんを継承すると、
class Mama(GrandPa):
def __init__(self):
super().__init__()
print('ママ')
class Boku(Papa, Mama):
def __init__(self):
super().__init__()
print('僕')
boku = Boku()
なんということでしょう〜
おじいちゃん
ママ
パパ
僕
ママが出てきた!
調べる気力が無いので、また今度。
追記¶
super()が足りなかったようです。しみずかわさんありがとう。
GranPaとGranMaが
— Takayuki Shimizukawa (@shimizukawa) 2017年12月6日
super().__init__()呼んでないからだねー https://t.co/BOhrEEcg51