python重写方法,无需重新复制整个代码

标签 python oop inheritance

我有一个类Father,我调用它的run方法来完成这项工作。我用 Child 类继承这个类。看起来像这样:

class Father:
    def __init__(self):
        ...

    def run(self):
        work1()
        work2()
        ....

class Child(Father):
    def run(self):
        pass

通常,我使用 pass,因为大多数时候, children 做与父亲相同的事情,只是从不同的上下文中被调用。然而,有时行为会改变。但当它执行时,来自 Fatherwork1work2 等仍在执行。只应添加最后一个workn

如何能够重写 run 方法,而无需从 Father.run 复制整个代码,而只需添加最后一个 work操作说明?我已经尝试过这个,它有效:

class Father:
    def run(self):
        work1()
        ...
        run_additionnal_stuf()
    def run_additionnal_stuf(self):
        pass

class Child(Father):
    def run_additionnal_stuf(self):
        work()

但是,有没有更优雅的解决方案呢?

最佳答案

首先,如果您的 Child 类没有更改方法,则无需使用 pass 定义它。简单地什么都不做,感谢 inheritance magic ,子实例也将具有该方法。

<小时/>

对于您的实际问题,如果您只想为子实例添加功能,您可以使用 super 。事实上,从文档来看:

This is useful for accessing inherited methods that have been overridden in a class.

所以你可以这样做:

class Child(Father):
    def run(self):
        super().run()
        work_n()
<小时/>

一个简单的演示:

class Father:
    def run(self):
        print("In Father")

class Child(Father):
    def run(self):
        super().run()
        print("In Child")

f = Father()
c = Child()
f.run()
c.run()

这预期打印出来:

In Father
In Father
In Child

关于python重写方法,无需重新复制整个代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375616/

相关文章:

java - 我没有从我的 java 应用程序中得到预期的输出

c++ - 模板中类型别名的继承

Python 不读取文件,返回空结果

python - 为每个问题生成一次随机值 Python

python - dask 可以用于在核心之外进行分组和重新编码吗?

javascript - 无法输入 django Chartit 格式化程序字段

ruby-on-rails - 有没有办法在模块中使用类方法而不在 Rails 中扩展它?

oop - 在这种情况下是否首选方法而不是函数

c++ - 是否有可能派生使父成员可变?

java - 使用testng继承selenium webdriver