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
将来自Parent2
,bar
将来自object
(它没有这样的属性,大概是导致你只是顺便提到的错误)。相反,在您的super
调用中使用Child
和Parent1
。
为什么不直接使用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中的多重继承与超级[重复]的主要内容,如果未能解决你的问题,请参考以下文章