【问题标题】:Call base class method when derived class overloads it派生类重载时调用基类方法
【发布时间】:2013-04-26 13:59:59
【问题描述】:

我有以下几点:

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中的原始A.x,如何引用它?

【问题讨论】:

    标签: python class overloading


    【解决方案1】:

    像这样:

    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

    【讨论】:

    • 很难解释:Abis.x实际上是在调用A.y,而A.y又在调用A.x。 Abis.x 以透明的方式扩展了 A.x 的功能,但最终必须使用 A.x。
    • 如果它“难以解释”并且外部观察者说它“有点奇怪”,您可能应该考虑是否可以改进您的设计。
    【解决方案2】:

    你想要“超级”功能:

    super(Abis, self).x ()
    

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

    【讨论】:

    • 这意味着A 的基类定义必须知道Abis 的子类是正在使用的。正确的答案是,如果你想让它调用A.x 然后调用A.x(self)
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2016-01-01
    • 2014-10-31
    • 1970-01-01
    • 2023-03-12
    • 2014-12-23
    • 2014-03-17
    相关资源
    最近更新 更多