python中的多重继承与超级[重复]

Posted

技术标签:

【中文标题】python中的多重继承与超级[重复]【英文标题】:multiple inheritance in python with super [duplicate] 【发布时间】:2016-09-03 18:24:00 【问题描述】:
class Parent1(object):
    def foo(self):
        print "P1 foo"

    def bar(self):
        print "P1 bar"


class Parent2(object):
    def foo(self):
        print "P2 foo"

    def bar(self):
        print "P2 bar"



class Child(Parent1, Parent2):
    def foo(self):
        super(Parent1, self).foo()

    def bar(self):
        super(Parent2, self).bar()

c = Child() 
c.foo()
c.bar()

目的是从 Parent1 继承 foo() 并从 Parent2 继承 bar()。但是导致 parent2 和 c.bar() 的 c.foo() 导致错误。请指出问题并提供解决方案。

【问题讨论】:

super 的第一个参数是在继承层次结构中开始查找“上方”的类,因此foo 将来自Parent2bar 将来自object(它没有这样的属性,大概是导致你只是顺便提到的错误)。相反,在您的super 调用中使用ChildParent1 为什么不直接使用Parent1.foo()Parent2.bar() @jonrsharpe:感谢您的澄清。您建议的可能重复的问题具有初始化函数 init 。所以,我不确定普通方法和 init 是否会遵循相同的继承规则 所有实例方法,__init__ 和其他 "magic" 方法包括在内,都遵循相同的规则。 【参考方案1】:

您可以直接在父类上调用方法,手动提供self 参数。这应该为您提供***别的控制,并且是最容易理解的方式。但从其他角度来看,它可能不是最理想的。

这里只有 Child 类,其余代码保持不变:

class Child(Parent1, Parent2):
    def foo(self):
        Parent1.foo(self)

    def bar(self):
        Parent2.bar(self)

使用描述的更改运行您的 sn-p 会产生所需的输出:

P1 foo
P2 bar

See this code running on ideone.com

【讨论】:

我们在定义引用对象的方法时提供 self 。但是当我们从子类调用方法时,我们手动提供它。那么它是如何工作的呢? MyClass 类中,你可能有一个像def foo(self, arg1, arg2) 这样定义的方法。当你运行my_instance = MyClass() 时,你创建了你的类的一个新实例。现在您可以像这样从实例对象调用方法:my_instance.foo("This is arg1", "This is arg2")。这样,self 参数被隐式设置为我们调用该方法的实例对象,即这里它将是my_instance。现在,如果我们在特定类上调用相同的方法,我们必须显式提供self 参数:MyClass.foo(my_instance, "This is arg1", "This is arg2")。好吗?

以上是关于python中的多重继承与超级[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用PyQt(QMainWindow)使用多重继承进行子类化时python中的MRO [重复]

多重继承中无用的超级? [复制]

python中多重继承与获取对象

具有相同名称的函数的类中的多重继承[重复]

python多重继承

python super()函数的用法与多重继承