Python扩展具有相同方法名称的类

时间:2013-07-19 13:38:23

标签: python

在Python中,如果你有一个扩展2个或更多类的类,如果它们都有一个标题为 save 的方法,它如何知道要调用哪个类方法?

class File(models.Model, Storage, SomethingElse):

    def run(self):
        self.save()

如果存储有 save(),SomethingElse()有 save(),该怎么办? 任何人都可以简单解释一下吗?

2 个答案:

答案 0 :(得分:3)

  

Python也支持有限形式的多重继承。一个   具有多个基类的类定义如下所示:

     

类DerivedClassName(Base1,Base2,Base3):              。       。       

     

解释语义所需的唯一规则是用于类属性引用的解析规则。这是   深度优先,从左到右 。因此,如果找不到属性   DerivedClassName,它在Base1中搜索,然后(递归地)在   Base1的基类,只有在那里找不到它,它才是   在Base2中搜索,依此类推。

因此,在您的示例中,如果所有3个类都有方法save,则File的实例将使用save中的方法models.Model

答案 1 :(得分:1)

实际上,当发生这种情况时,您可能希望编写自己的save,它可以替换或使用其中一种基类方法。

假设你想打电话给他们:

class MyFile(models.Model, Storage, SomethingElse): #file is a builtin class. Confusion will abound

    def run(self):
        self.save()

    def save():
        super(Storage, self).save() # start search for method in Storage
        super(models.Model,self).save() # start search for method in models.Model

请注意,如果mro的{​​{1}}(请参阅:http://www.python.org/download/releases/2.3/mro/)不包含models.Model,而save不包含Storage,则会最后两次调用相同的方法。

这里有一个更全面的探索:http://rhettinger.wordpress.com/2011/05/26/super-considered-super/(现在与官方文档相关联)。