派生类重载它时调用基类方法

dan*_*ast 1 python overloading class

我有以下内容:

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()
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

Bye
Bye
Run Code Online (Sandbox Code Playgroud)

但我其实想要:

Bye
Hello
Run Code Online (Sandbox Code Playgroud)

因为我想A.y称之为"原创" A.x.我怎么可以参考原A.x中A,当派生类重载了吗?

Ric*_*dle 5

像这样:

class A(object):
    def x(self): print "Hello"
    def y(self): A.x(self)
Run Code Online (Sandbox Code Playgroud)

......虽然那有点奇怪.x如果你不希望在这种情况下调用它,为什么你(或者,为什么有人)压倒一切?

如果您不希望它被覆盖,请给它一个双下划线前缀:

class A(object):
    def __x(self): print "Hello"
    def y(self): self.__x()
Run Code Online (Sandbox Code Playgroud)

__x在派生类中定义的任何人都将获得自己的唯一__x不会覆盖您的类 - 请参阅私有变量和类本地引用.

  • 如果它"难以解释"并且外部观察者说它"稍微有点",那么您应该考虑是否可以改进您的设计. (2认同)

Nat*_*nst 5

你想要“超级”功能:

super(Abis, self).x ()
Run Code Online (Sandbox Code Playgroud)

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