タイトルは思い付きで。
これの続き。
test.py
class A(object):
def primary_process(self):
print('A')
def say_this_func_name(self):
pass
class B(A):
def first_process(self):
super().primary_process()
def say_this_func_name(self):
print('B')
class C(A):
def first_process(self):
super().primary_process()
def say_this_func_name(self):
print('C')
class D(A):
def first_process(self):
super().primary_process()
def say_this_func_name(self):
print('D')
class E(B, C, D):
def __init__(self):
super().first_process()
def say_B(self):
super().say_this_func_name()
def say_C(self):
super(B, self).say_this_func_name()
def say_D(self):
super(C, self).say_this_func_name()
print(E.mro())
b = E()
b.say_B()
c = E()
c.say_C()
d = E()
d.say_D()
で以下のように出力される。
[<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]
A
B
A
C
A
D
とりあえず望み通りの出力になった。
恐らくEの宣言時に継承するクラスの順序と関係があるんだろうけど
いまいち動きが良く分からない。。。
というわけでググってみた
https://www.lifewithpython.com/2014/01/python-super-function.html
super(B, self)という書き方はどうやら2系のときは標準だったらしい。
そもそも普段(非菱形継承時)から書いているsuper()は引数を省略していたようだ。
https://methane.hatenablog.jp/entry/20081227/1230400144
mroはmethod resolution orderの略。関数解決順とでもいうのだろうか。
おそらくメソッドチェーンなる概念があって、このチェーン順に関数名を検索して
初めにヒットした関数を使用しているのだろう。
となるとsuper(B, self)という書き方は<class '__main__.B'>
まで検索をスキップして
<class '__main__.C'>
から検索を始めろということなのだろうか。。。。
すぐ調査できそうだけどとりあえずまた今度。