0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

三菱形継承時の明示的クラス指定方法

Posted at

タイトルは思い付きで。
これの続き。


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'>から検索を始めろということなのだろうか。。。。

すぐ調査できそうだけどとりあえずまた今度。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?