我知道那里有很多类似的问题.但我的问题不同. 我不想制作一个无法覆盖的方法. 我想保护我新创建的类不要意外覆盖某些东西.
使用下划线作为前缀是相当不错的,但很快我会得到许多带有很多下划线的方法.在我继承的类中的某个地方,我将覆盖祖先祖先的类方法.
我真正想要的是这样简单:
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方法,你也可以使用它.
一般来说,您可能希望在最通用的超类中至少提供一个存根方法:
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)
但是,您只希望在异常情况下执行此操作,例如,从第三方库中继承类,出于某种原因,您不能依赖某些方法.