如何不小心覆盖python中的方法?

goF*_*ard 1 python class

我知道那里有很多类似的问题.但我的问题不同. 我不想制作一个无法覆盖的方法. 我想保护我新创建的类不要意外覆盖某些东西.

使用下划线作为前缀是相当不错的,但很快我会得到许多带有很多下划线的方法.在我继承的类中的某个地方,我将覆盖祖先祖先的类方法.

我真正想要的是这样简单:

class Cat(Mammal):
    def walk(self):
        if ancestor_has_function('walk'):
            parent.walk();
        do_something_here();
Run Code Online (Sandbox Code Playgroud)

如果任何Cat的祖先(无论是哺乳动物,动物还是生命形式)都有"行走"方法,那么应首先执行父方法.

这有可能在python中这样做吗?

编辑: 例如,这是我认为好的答案的简历.希望这会有助于其他人:

class Animal(object):
    pass
    #def walk(self):
    #    print('animal walk')

class Mammal(Animal):
    def walk(self):
        if hasattr(super(Mammal, self), 'walk') and callable(super(Mammal,self).walk):
            super(Mammal, self).walk()
        print('mammal walk')

class Cat(Mammal):
    def walk(self):
        super(Cat, self).walk()
        print('cat walk')

if __name__ == '__main__':
    cat = Cat()
    cat.walk()
Run Code Online (Sandbox Code Playgroud)

这是输出:

哺乳动物走路

猫步

尝试取消注释Animal的walk方法,你也可以使用它.

Pi *_*ort 7

一般来说,您可能希望在最通用的超类中至少提供一个存根方法:

class Mammal(object):
    def walk(self):
        pass
Run Code Online (Sandbox Code Playgroud)

然后,通过调用super()以下内容在子类中扩展它:

class Cat(Mammal):
    def walk(self):
        super(Cat, self).walk()  # or just super().walk(), in Python 3+
        do_something_here()
Run Code Online (Sandbox Code Playgroud)

使super()有条件的呼叫并不难,但这可能是一个坏主意:它冗长,脆弱,只会鼓励不良做法.如果你真的,真的有充分的理由去做,你就可以hasattr()super对象上使用,就像你对任何其他对象一样:

class Cat(Mammal):
    def walk(self):
        if hasattr(super(Cat, self), 'walk'):
            super(Cat, self).walk()
        do_something_here()
Run Code Online (Sandbox Code Playgroud)

但是,您只希望在异常情况下执行此操作,例如,从第三方库中继承类,出于某种原因,您不能依赖某些方法.