Help us understand the problem. What is going on with this article?

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

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


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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした