我知道那里有很多类似的问题。但我的问题是不同的。 我不想创建一个不能被覆盖的方法。 我想保护我新创建的类,以免意外覆盖某些内容。
使用下划线作为前缀是很不错的,但是很快我就会得到很多带有很多下划线的方法。在我继承的类中的某处,我将重写祖父的类方法。
我真正想要的是像这样简单的东西:
class Cat(Mammal):
def walk(self):
if ancestor_has_function('walk'):
parent.walk();
do_something_here();
如果 Cat 的任何祖先(Mammal、Animal 或 LifeForm)具有“walk”方法,则应首先执行父方法。
是否有可能在 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()
这是输出:
mammal walk
cat walk
尝试取消 Animal 的 walk 方法的注释,你也会让它工作。
请您参考如下方法:
一般来说,您可能希望在最通用的父类(super class)中至少提供一个 stub 方法:
class Mammal(object):
def walk(self):
pass
然后,通过调用 super() 在子类中扩展它:
class Cat(Mammal):
def walk(self):
super(Cat, self).walk() # or just super().walk(), in Python 3+
do_something_here()
使 super() 调用有条件并不难,但这可能是个坏主意:它冗长、脆弱,并且只会鼓励不良做法。如果你真的,真的有充分的理由这样做,你可以在 super 对象上使用 hasattr(),就像你对任何其他对象:
class Cat(Mammal):
def walk(self):
if hasattr(super(Cat, self), 'walk'):
super(Cat, self).walk()
do_something_here()
不过,您可能只想在不寻常的情况下执行此操作,例如出于某种原因您不能依赖于存在的某些方法的第三方库中的类的子类。
