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 D
IS (D, B, C, A)
。呼び出しに注目してくださいsuper().foo
にB.foo
。探している相手だけクラスでB
、あなたはそれが仮定かもしれないsuper().foo()
の呼び出しですA.foo
。場合しかしself
のインスタンスであるD
(と同様にD().foo()
、例えば、)、次いでsuper
指すC
ないA
ので、C
直後に来るB
MROです。
>>> D().foo()
A
C
B
D
foo
(MROのクラスを出力サンセリフ object
; A
使用していないsuper
ので、A
「導入」foo
の階層に)少なくともから最も具体的には、逆の順序で。