Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@shirai116

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

More than 1 year has passed since last update.

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


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
Help us understand the problem. What is going on with this article?
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
shirai116
動いたプログラムのメモ書き用

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?