2015-01-26 90 views
0

如果一個類繼承多個類,爲什麼超類可以相互訪問其他超類的函數?超類從哪裏獲得參考?mixin的引用如何傳遞給python中的另一個mixin?

例如

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 
+0

超類不這樣做,子類是。 – 2015-01-26 23:23:17

回答

1

當你定義一個類,從兩個超

class test(A, B): 

它繼承了來自超類的方法到命名空間繼承。所以,從test(),你可以撥打self.a_method()self.b_method()。我想,你的問題是爲什麼從test的實例調用self.b_method()的原因,但不是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'] 
相關問題