Różnica między super (). Method () a super (self .__ klasa __, self) .method () [duplikat]
To pytanie ma już tutaj odpowiedź:
Czy podczas wywoływania super () w klasie pochodnej mogę przekazać siebie .__ class__? [duplikować] 2 odpowiedziOto kod, który próbowałem napisać:
class A(object):
def bind_foo(self):
old_foo = self.foo
def new_foo():
old_foo()
#super().foo()
super(self.__class__,self).foo()
self.foo = new_foo
def __init__(self):
print("A __init__")
def foo(self):
print("A foo")
class B(A):
def __init__(self):
print("B __init__")
super().__init__()
def foo(self):
print("B foo")
super().foo()
class C(A):
def __init__(self):
print("C __init__")
super().__init__()
super().bind_foo()
def foo(self):
print("C foo")
b = B()
b.foo()
c = C()
c.foo()
Klasa B i A to oczekiwane zachowanie, to znaczy kiedy dzwonięb.foo()
, to dzwonia.foo()
jak również zsuper()
. Klasa C to próba naśladowania zachowania dziecka B i rodzica A, ale tym razem nie chcę tego wyraźnie określaćsuper().foo()
w klasie potomnej, ale nadal chcę mieć rodzicafoo()
być nazywanym. Działa zgodnie z oczekiwaniami.
Jednak nie do końca rozumiem, że podA.bind_foo
, Muszę użyćsuper(self.__class__,self).foo()
zamiastsuper().foo
. super().foo
daje
"SystemError: super(): no arguments".
Czy ktoś może wyjaśnić, dlaczego tak jest?