我一直在研究一个类似于此的多继承代码:
class Document():
def save(self, x):
print "inside Document from " + x
class Cdm(object):
def save(self,x):
print "inside Cdm from " + x
super(Cdm,self).save('Cdm')
class Contacts(Cdm, Document):
def __init__(self):
self.save('Contacts')
这是我创建Contacts实例时得到的结果。
> c = Contacts()
< inside Cdm from Contacts
< inside Document from Cdm
现在这很奇怪,可能在我看来。我可能误解了一些东西。如您所见,类Contacts继承自cdm和Document。我试图使用来自Contacts的Cdm的保存方法。但是Cdm继承自object并且没有名为save的超类方法,但它从Document类调用save函数。在程序中我正在工作,这是我想要的行为,但我担心理论上它不应该工作或者至少我认为。
您对此有何评论?或者我误解了Python的继承。
答案 0 :(得分:3)
正如Python documentation所说:
super():返回一个代理对象,该方法将方法调用委托给类型的父类或兄弟类。
在这种情况下,super(Cdm,self).save('Cdm')
会调用save()
的版本,这是方法解析顺序的下一个版本。在这种情况下,它是save()
类中的Document
方法,因为它是Cdm
的兄弟类(即它是Contacts
的第二个基类)。
super()
的一个很好的实用解释可以在这里找到:Python’s super() considered super!
答案 1 :(得分:1)
super(Cdm,self).save('Cdm')
调用mro中下一个类的save
方法。这可能不是当前班级的直接父母。
有关超级工作原理及其用途的详情,请参阅the documentation和this blog post。