从这里开始,如果你定义一些这样的对象:
class Mixin1(object): def test(self): print "Mixin1" class Mixin2(object): def test(self): print "Mixin2" class BaseClass(object): pass class MyClass(Mixin2, Mixin1, BaseClass): pass
你会得到:
>>> obj = MyClass() >>> obj.test() Mixin2
有办法调用方法吗?Mixin1
test()
明确地称它:
Mixin1.test(obj)
Python中的属性过程相对复杂.对于您给出的示例,这是查找以下值的过程obj.test
:
首先,看一下实例本身.在这种情况下,实例没有test
属性.
查看obj
作为以下实例的类:MyClass
.MyClass
没有test
属性.
开始按方法解析顺序查看类MyClass
.在这种情况下,MyClass.__mro__
告诉你先看Mixin2
,然后Mixin1
,然后object
.
Mixin2
有一个test
属性,所以我们终于有一个匹配.
Mixin2.test
是一个带__get__
方法的函数,因此调用它并使用返回值.
您可以放心地忽略此处的步骤5,并假设这Mixin2.test
是一种方法.返回一个,你可以看到那些obj.test()
电话Mixin2.test
.
这可能有助于解释我在评论中提出问题的原因.您可以通过多种方式摆弄程序,以便obj.test()
进行调用Mixin1.test()
.你可以修补对象,MyClass.__mro__
你可以调整,你可以调整Mixin2.test
实际做的事情,等等.