python3に継承クラスなしでスーパーを使用して

jacobcan118:

誰もが、それは上のコードを次のために何を意味するのか知っていますかsuper(xxx, self).__init__()それは何をするためのものか?私はかかわらず、それは他のクラスからクラスのABC継承する必要がありますが、私はから継承されたクラスが表示されません。

class ABC:

    def __init__(self):
        super(ABC, self).__init__()
chepner:

superクラスのメソッド解決順序(MRO)で動作します。MROは常にクラス自身、そして少なくとも二つのクラスが含まれていますobject(すべてのクラスが暗黙的に継承しているためobject

>>> class ABC: pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'object'>)

で明示的に名前の基底クラスがある場合classステートメントは、それらとそれらの基底クラスは、新しいクラスとの間MROのどこかに表示されますobject

>>> class ABC(str): pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'str'>, <class 'object'>)

あなたの質問については、「なぜsuper?」、この標準の例を考えてみます。

class A:
    def foo(self):
        print("A")


class B(A):
    def foo(self):
        super().foo()
        print("B")


class C(A):
    def foo(self):
        super().foo()
        print("C")


class D(B, C):
    def foo(self):
        super().foo()
        print("D")

以下のためのMRO DIS (D, B, C, A)呼び出しに注目してくださいsuper().fooB.foo探している相手だけクラスでB、あなたはそれが仮定かもしれないsuper().foo()の呼び出しですA.foo場合しかしselfのインスタンスであるD(と同様にD().foo()、例えば、)、次いでsuper指すCないAので、C直後に来るBMROです。

>>> D().foo()
A
C
B
D

foo(MROのクラスを出力サンセリフ object ; A使用していないsuperので、A「導入」fooの階層に)少なくともから最も具体的には、逆の順序で。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=8367&siteId=1