2013-04-26 29 views
1

我有以下几点:调用基类的方法类重载它

class A(object): 
    def x(self): print "Hello" 
    def y(self): self.x() 

class Abis(A): 
    def x(self): print "Bye" 

a = Abis() 
a.x() 
a.y() 

它打印:

Bye 
Bye 

但我其实想:

Bye 
Hello 

因为我想A.y拨打“原”A.x。当派生类重载它时,如何参考原始A.x中的A

回答

5

像这样:

class A(object): 
    def x(self): print "Hello" 
    def y(self): A.x(self) 

...虽然这是稍显怪异。为什么你(或者,为什么是某人)在这种情况下如果你不想让它叫做x

如果你不希望它覆盖做,给它一个双下划线前缀:

class A(object): 
    def __x(self): print "Hello" 
    def y(self): self.__x() 

任何人在派生类中定义__x将获得自己独特的__x不重写你的 - 见Private Variables and Class-local References

+0

难以解释:Abis.x实际上是调用A.y,它正在调用A.x. Abis.x以透明方式扩展A.x功能,但必须最终使用A.x. – dangonfast 2013-04-26 14:13:40

+2

如果“难以解释”,而外部观察者认​​为它“稍微有些奇怪”,那么您应该考虑是否可以改进您的设计。 – 2013-04-26 15:12:50

2

你想要的 “超级” 功能:

super(Abis, self).x() 

这将调用 “X” 上的基类。请参阅:docs.python.org/2/library/functions.html#super

+0

这意味着'A'的基类定义必须知道子类'Abis'是被使用的。正确的答案是,如果你想调用'A.x',然后调用'A.x(self)' – Duncan 2013-04-26 14:09:59

相关问题