Python super:调用基类方法,该方法包含另一个被派生类重写的基类方法 A类(对象): def foo(self): 打印“A-foo” def foo2(自我): 打印“foo2” self.foo() B(A)类: def foo(self): 打印“B-foo” def foo2(自我): super(B,self).foo2() B().foo2()
我正试图让[参议员1]:Python super:调用基类方法,该方法包含另一个被派生类重写的基类方法 A类(对象): def foo(self): 打印“A-foo” def foo2(自我): 打印“foo2” self.foo() B(A)类: def foo(self): 打印“B-foo” def foo2(自我): super(B,self).foo2() B().foo2(),python,Python,我正试图让[参议员1]: foo2 A - foo 但是我得到了[senario2]: foo2 B - foo 相反 我发现了,但我想知道是否有一种方法可以在不更改类a中方法foo的名称的情况下生成[senario1] 一种方法是在A上调用foo并手动将self传递给它: 这样,您将始终在A上调用foo。如果这个foo将调用self.foo(),那么它将再次调用Bs foo方法。正如Leon指出的,您可以通过通过A.foo硬编码显式调用并将实例对象作为参数传递,简单地访问A类中的foo方
foo2
A - foo
但是我得到了[senario2]:
foo2
B - foo
相反
我发现了,但我想知道是否有一种方法可以在不更改类
a
中方法foo
的名称的情况下生成[senario1] 一种方法是在A
上调用foo
并手动将self
传递给它:
这样,您将始终在
A
上调用foo
。如果这个foo
将调用self.foo()
,那么它将再次调用B
s foo方法。正如Leon指出的,您可以通过通过A.foo
硬编码显式调用并将实例对象作为参数传递,简单地访问A
类中的foo
方法,然而,正如拉温所说,这不是一个好的解决方案。实际上,这是错误的类设计的例子。为什么?
a.foo
在数百个地方使用显式调用。现在,尝试将A
类重命名为MagicUnicorn
类B
中覆盖A
中的foo
方法,则在99.9999%的情况下不需要覆盖A
中的foo
,因为必须有理由覆盖它B
中重命名foo
(正如Rawing所说):
您可以更改
A.foo2
,以便它显式调用A.foo(self)
,但这并不是一个好的解决方案。我认为最合适的修复方法是更改B.foo
的名称。如果它不应该覆盖A.foo
,那么,好吧,不要覆盖A.foo
。我想知道如果你在B.foo2
里面说类似于self的话会发生什么事。在一个简单的例子中,我已经测试了这一点,它按照预期工作,可能是您想要的。
class A(object):
def foo(self):
print("A - foo")
def foo2(self):
print("foo2")
A.foo(self)
class B(A):
def foo(self):
print("B - foo")
def foo2(self):
super(B, self).foo2()
B().foo2()
class A(object):
def foo(self):
print "A - foo"
def foo2(self):
print "foo2"
self.foo()
class B(A):
def unicorn_foo(self):
print "B - foo"
def foo2(self):
super(B, self).foo2()
B().foo2()