在 odoo 中跳过继承顺序调用

我有一个从项目.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

任何建议将非常受欢迎


心有法竹
浏览 187回答 1
1回答

智慧大石

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

相关分类

Python