Python mixins如何区分同样的方法?

时间:2015-12-10 15:12:04

标签: python

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()方法?

2 个答案:

答案 0 :(得分:5)

明确地称之为:

Mixin1.test(obj)

Python中的属性过程相对复杂。对于您的示例,这是查找obj.test

的值的过程
  1. 首先,查看实例本身。在这种情况下,实例没有test属性。
  2. 查看objMyClass的实例的类。 MyClass没有test属性。
  3. 开始以MyClass的方法解析顺序查看类。在这种情况下,MyClass.__mro__会让您先查看Mixin2,然后Mixin1,然后object
  4. Mixin2具有test属性,因此我们最终匹配。
  5. Mixin2.test是一个带__get__方法的函数,因此调用它并使用返回值。
  6. 您可以放心地忽略此处的第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)