python - 从层次结构中的顶级类调用方法而不是覆盖

标签 python oop inheritance

假设我有类 Base(object)Derived(Base)。它们都实现了函数 foo,其中 Derived.foo 覆盖 Base 中的版本。

但是,在其中一种方法中,例如Base.learn_to_foo,我想调用Base.foo而不是派生版本,无论它是否被覆盖。因此,我在该方法中调用 Base.foo(self) :

class Base(object):
    # ...

    def learn_to_foo(self, x):
        y = Base.foo(self, x)
        # check if we foo'd correctly, do interesting stuff

这种方法似乎有效,从领域的角度来看,它非常有意义,但不知怎的,它闻起来有点可疑。这是要走的路,还是应该重构?

最佳答案

答案是使用super()函数。您所做的方式完全正确,因为您不想调用父类(super class)中重写的虚拟方法。由于您似乎一直希望基类的精确实现,唯一的方法是获取基类的未绑定(bind)方法对象,将其绑定(bind)到self,这可以是BaseDerived 的实例。使用显式提供的 self 调用未绑定(bind)方法,因为第一个参数会返回一个绑定(bind)方法。从现在开始,Base.foo 将作用于实例 self 的数据。这是完全可以接受的,也是 Python 处理非虚拟方法调用的方式。这是 Python 允许您做而 Java 却做不到的好事之一。

关于python - 从层次结构中的顶级类调用方法而不是覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871542/

相关文章:

python - 无法挤压 dim[1],期望维度为 1,得到 499

python - 从嵌套字典构建类

python - 如何模拟 psycopg2 光标对象?

python - 模块 Seaborn 没有属性 '<any graph>'

javascript面向对象函数调用初学者问题

java - 带有类型转换/结构问题的 OO 设计

python - 关于 python 脚本

java - 抽象方法中的参数 (Java 7)

CSS3 动画 : inherit property for keyframe at 0%

python - Pandas :添加其他列的长度作为值的列