为了账号安全,请及时绑定邮箱和手机立即绑定

在 odoo 中跳过继承顺序调用

在 odoo 中跳过继承顺序调用

心有法竹 2022-09-20 10:08:12
我有一个从项目.task继承的类,名为项目任务该类有一个复制方法,该方法重写了项目.task 的复制函数,该方法名为 Task我需要从我的类运行基本复制函数,而不是父类之一这是我的类代码:@api.multi@api.returns('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这是来自基类(任务)的复制方法@api.multi@api.returns('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 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号