在 Python 中,如果您有一个扩展 2 个或更多类的类,如果它们都有名为save的方法,它如何知道要调用哪个类方法?
class File(models.Model, Storage, SomethingElse):
def run(self):
self.save()
如果 Storage 有一个save(),什么是 SomethingElse() 有一个save()?谁能简要解释一下?
在 Python 中,如果您有一个扩展 2 个或更多类的类,如果它们都有名为save的方法,它如何知道要调用哪个类方法?
class File(models.Model, Storage, SomethingElse):
def run(self):
self.save()
如果 Storage 有一个save(),什么是 SomethingElse() 有一个save()?谁能简要解释一下?
Python 也支持有限形式的多重继承。具有多个基类的类定义如下所示:
类派生类名称(Base1,Base2,Base3):。. .
解释语义所需的唯一规则是用于类属性引用的解析规则。这是 深度优先,从左到右。因此,如果在 DerivedClassName 中没有找到某个属性,则在 Base1 中搜索它,然后(递归地)在 Base1 的基类中搜索,并且只有在那里没有找到时,才在 Base2 中搜索,依此类推。
因此,在您的示例中,如果所有 3 个类都有方法save
实例,File
则将使用方法save
frommodels.Model
在实践中,当发生这种情况时,您可能希望编写自己的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/ (现在链接到官方文档)。