【发布时间】:2011-12-13 03:53:34
【问题描述】:
这段代码抛出了一个异常,AttributeError, "wtf!",因为A.foo()正在调用B.foo1(),它不应该调用A.foo1()吗?如何强制它调用A.foo1()(A.foo() 中的任何方法调用都应该调用A.*)
class A(object):
def foo(self):
print self.foo1()
def foo1(self):
return "foo"
class B(A):
def foo1(self):
raise AttributeError, "wtf!"
def foo(self):
raise AttributeError, "wtf!"
def foo2(self):
super(B, self).foo()
myB = B()
myB.foo2()
【问题讨论】:
-
您基本上是在要求 Python 抛弃动态性和虚拟方法,并且 不知何故 根据函数的词法定义位置找出跳过属性查找链的部分内容。不会发生。
-
我认为这是糟糕设计的标志。如果你在你的子类中重写了一个方法,但你不希望它被调用,这难道不是你做错了什么的迹象吗?我认为你应该重新考虑你的类层次结构——也许
B不应该是A的子类。 -
我还是有同样的问题。
B.foo2可以是对A.foo实现的增强(例如,在B.foo2中的super行之后再添加一行)。在这种情况下,您希望A.foo调用A.foo1,即按原意调用父实现,然后才对其进行增强。下面的答案围绕在B.foo2中显式使用A.foo(self)或更糟糕的是在A.foo中显式使用A.foo1(self)。但是答案可能会更改A,super是为了解决这个问题,对吧?
标签: python inheritance superclass