这是我试图编写的代码:
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()
类B和A是期望的行为,也就是说,当我调用b.foo()时,它会同时调用a.foo()并使用super()。类C试图模仿子类B和父类A的行为,但这次我不想在子类中显式地放置super().foo(),但仍希望调用父类的foo()。它的工作方式符合预期。
然而,我不太明白的是,在A.bind_foo下,我必须使用super(self.__class__,self).foo()而不是super().foo。 super().foo返回一个
"SystemError: super(): no arguments".
有人能解释一下为什么会这样吗?
bind_foo
中所做的是错误的。super(self.__class__, self).foo()
实际上是在实例的第一个超类上调用foo
。因此,如果你有class B(A)
,然后class C(B)
,然后class D(C)
,并且执行D().bind_foo()
,你最终会调用C
的实现。这不是你想要的。如果你想调用D
的实现,只需调用self.foo()
。如果你想调用A
的实现,请调用A.foo(self)
。 - abarnertD
调用自己的实现,然后是C
,然后是B
,最后是A
。 - No Harm In Trying