从here开始,如果您定义了类似的对象:
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()
方法?
答案 0 :(得分:5)
明确地称之为:
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
实际做的事情等等。
答案 1 :(得分:3)
覆盖test
方法并明确调用Mixin1.test
:
class MyClass(Mixin2, Mixin1, BaseClass):
def test(self):
Mixin1.test(self)