Quirk在Python中进行多重继承!至少我是这么认为的

时间:2011-10-13 10:59:02

标签: python inheritance

我一直在研究一个类似于此的多继承代码:

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的继承。

2 个答案:

答案 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 documentationthis blog post