【问题标题】:python overriding method without re-copying whole codepython覆盖方法而不重新复制整个代码
【发布时间】:2019-08-06 12:00:27
【问题描述】:

我有一个班级 Father 我称之为 run 方法来完成这项工作。我用Child 类继承了这个类。看起来像这样:

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

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

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

通常,我使用pass,因为大多数时候,孩子做的事情和父亲一样,只是在不同的上下文中被调用。但是,有时行为会发生变化。但当它执行时,work1work2 等来自Father 的代码仍在执行中。只应添加最后一个 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()

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

【问题讨论】:

    标签: python oop inheritance


    【解决方案1】:

    首先,如果你的Child 类没有改​​变一个方法,你就不需要用pass 定义它。什么都不做,感谢inheritance magic,子实例也将拥有该方法。


    至于您的实际问题,如果您只想向子实例添加功能,您可以使用super。确实,来自文档:

    这对于访问已被继承的继承方法很有用 在类中被覆盖。

    所以你可以这样做:

    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
    

    【讨论】:

    • 如果你使用super(),你必须在任何地方使用它!同样在Father.run() 中,否则可以构建继承层次结构,其中并非所有方法都被实际调用。见:fuhm.net/super-harmful
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 2018-01-08
    • 2016-07-09
    • 1970-01-01
    • 2014-10-02
    • 2015-07-24
    • 2014-04-16
    • 2013-02-15
    相关资源
    最近更新 更多