亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 odoo 中跳過繼承順序調用

在 odoo 中跳過繼承順序調用

心有法竹 2022-09-20 10:08:12
我有一個從項目.task繼承的類,名為項目任務該類有一個復制方法,該方法重寫了項目.task 的復制函數,該方法名為 Task我需要從我的類運行基本復制函數,而不是父類之一這是我的類代碼:@[email protected]('self', lambda value: value.id)def copy(self, default=None):    if default is None:        default = {}    if not default.get('name'):        default['name'] = self.name.id    return super(ProjectTask, self).copy(default) #<-- I don't want to call the inherited class method I want to call the base class method instead這是來自基類(任務)的復制方法@[email protected]('self', lambda value: value.id)def copy(self, default=None):    if default is None:        default = {}    if not default.get('name'):        default['name'] = _("%s (copy)") % self.name    return super(Task, self).copy(default) # <-- I want to run this method from my class (ProjectTask) which is the child class任何建議將非常受歡迎
查看完整描述

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!

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


查看完整回答
反對 回復 2022-09-20
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號