1

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

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

    def run(self):
        self.save()

如果 Storage 有一个save(),什么是 SomethingElse() 有一个save()?谁能简要解释一下?

4

2 回答 2

3

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

类派生类名称(Base1,Base2,Base3):。. .

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

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

于 2013-07-19T13:41:05.143 回答
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(参见: http: //www.python.org/download/releases/2.3/mro/models.Model不包含 a save,并且包含Storage,您最终将调用相同的方法两次。

更全面的探索在这里:http ://rhettinger.wordpress.com/2011/05/26/super-considered-super/ (现在链接到官方文档)。

于 2013-07-19T13:50:24.300 回答