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!
最后一點:如果你發現自己想跳過父類對其某些方法的實現,也許你應該重新考慮是否真的應該從它那里繼承。可能是你真的想從與它相同的基類繼承,并完全跳過中產階級。顯然,這有其自身的局限性(也許一些庫代碼會對該類進行類型檢查),但是如果您發現自己與繼承機制作斗爭,則可能是您做事的方式很艱難,并且有一種更簡單的選擇。
添加回答
舉報