class A(object):
def foo(self):
print "A - foo"
def foo2(self):
print "foo2"
self.foo()
class B(A):
def foo(self):
print "B - foo"
def foo2(self):
super(B, self).foo2()
B().foo2()
我试图获得[senario1]:
foo2
A - foo
但得到了[senario2]:
foo2
B - foo
代替。
我找到the explanation,但我想知道是否有一种方法可以在不改变类foo
中方法A
的名称的情况下产生[senario1]?
答案 0 :(得分:2)
执行此操作的一种方法是在foo
上致电A
并手动将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()
这样您就可以在foo
上致电A
。如果此foo
会调用self.foo()
,则会再次调用B
的foo方法。
答案 1 :(得分:1)
正如Leon指出的那样,您可以通过foo
对显式调用进行硬编码并将实例对象作为参数传递来简单地访问A
类中的A.foo
方法,但是正如Rawing所说的那样#39;不是很好的解决方案。实际上它是错误的课堂设计的例子。为什么呢?
想象一下,在一个更大的项目中,您将在数百个地方通过A.foo
使用显式调用。现在,尝试将您的A
课程重命名为MagicUnicorn
课程。
这是违反直觉的。如果您从foo
中的A
覆盖B
方法,那么在99.9999%的情况下不需要foo
A
,因为必须有覆盖的理由它
更好的解决方案,而不是使用显式调用,将重命名foo
中的B
(正如Rawing所说):
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()