mixin的引用如何传递给python中的另一个mixin?

时间:2015-01-26 23:14:42

标签: python

如果一个类继承多个类,为什么超类可以相互访问其他超类的函数?超类从哪里获取引用?

例如

class A():
    def a_method(self):
        print "I am a"

class B():
    def b_method(self):
        self.a_method()

class test(A, B):
    def test_method(self):
        self.b_method()

if __name__ == "__main__":
    test_instance = test()
    # Will print a_method
    test_instance.test_method()

    test_b = B()

    try:
        # will raise exception
        test_b.b_method()
    except Exception as e:
        print e

1 个答案:

答案 0 :(得分:1)

将类定义为从两个超类继承时

class test(A, B):

它将两个超类中的方法继承到相同的命名空间。因此,从test()开始,您可以同时调用self.a_method()self.b_method()。我认为,您的问题是调用self.b_method()来自test的实例,而不是B的实例。它适用于test,因为两个方法都在同一个命名空间中,当b_method()调用a_method()时,它可以被"看到"来自班级内部,呼叫成功。在实例化B时,A不会继承,a_method()不可见,因此会引发异常。

可以使用dir检查与类或实例关联的方法和属性:

>>> test_instance = test()
>>> dir(test_instance)
['__doc__', '__module__', 'a_method', 'b_method', 'test_method']