在Python中,如果你有一个扩展2个或更多类的类,如果它们都有一个标题为 save 的方法,它如何知道要调用哪个类方法?
class File(models.Model, Storage, SomethingElse):
def run(self):
self.save()
如果存储有 save(),SomethingElse()有 save(),该怎么办? 任何人都可以简单解释一下吗?
答案 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/(现在与官方文档相关联)。