1 回答
TA贡献1946条经验 获得超3个赞
使用您显示的父类实现,用您自己的方式调用它应该可以做您想要的,因为它只会将其传递到自己的父类,而不会进行任何更改。(至少,对于裸方法代码来说,这是真的,我不知道odoo装饰器做了什么来改变事情。default
但是,如果您确实出于某些不明显的原因确实需要跳过它,那么您可能可以做到。一般来说,这些方法只有在您不希望您的类与多重继承一起使用时才能按预期工作。如果你的MRO变得复杂,那么你真的想做正常的事情,让你的所有方法都能很好地协同工作。super
跳过继承方法的一个选项是直接命名您希望调用转到的类(即您的祖父类)。
class Base():
def foo(self):
print("Base")
class Parent(Base):
def foo(self):
print("Parent")
super().foo() # super() in Python 3 is equivalent to super(Parent, self)
class Child(Parent):
def foo(self):
print("Child")
Base.foo(self) # call Base.foo directly, we need to pass the self argument ourselves
另一种选择是更改您给出的参数以命名父类而不是您自己的类。通常这是一个新手错误,但如果这真的是你想要的,它是允许的(尽管我强烈建议在代码中添加一个注释,解释你真的想要这种行为!super
class Child(Parent):
def foo(self):
print("Child")
super(Parent, self).foo() # Note: Deliberately skipping over Parent.foo here!
最后一点:如果你发现自己想跳过父类对其某些方法的实现,也许你应该重新考虑是否真的应该从它那里继承。可能是你真的想从与它相同的基类继承,并完全跳过中产阶级。显然,这有其自身的局限性(也许一些库代码会对该类进行类型检查),但是如果您发现自己与继承机制作斗争,则可能是您做事的方式很艰难,并且有一种更简单的选择。
添加回答
举报
