本文詳細介紹了Python中類型關系和繼承關系。分享給大家供大家參考。具體分析如下:
如果一個對象A持有另一個對象B的ID,那麼檢索到A之後就可以檢索到B,我們就說存在一個A到B的導航。這種導航關系使得Python中所有對象之間形成了一個復雜的網絡結構。
Python程序的運行包括:
1. 修改這個網絡結構;
2. 執行有副作用的代碼對象(code object或者說bytecode,見Python Language Reference 3.2)
(副作用是指影響Python虛擬機之外的設備,這些代碼都是用C或者別的語言寫的,Python寫的代碼只能完成第一步的功能。print語句除外。)
Python對象之間有兩種導航關系:繼承關系和類型關系,是Python中最基本的關系。類型關系說明一個對象是通過哪個對象創建的;繼承關系說明對象之間的父子關系,這種父子關系在名字的解析過程中起到作用。這裡我首先說New Style類之間的這兩種關系,掌握了New Style類的關系後,再來說明Classic類就容易了。
首先需要說明一下的是內置模塊中的type是什麼。大家都知道type可以用來判斷一個對象的類型,好像是一個函數。實際上在2.2中type是一個類,而且不是普通的類,是一個可以創建類的類,稱為元類。你運行type(type)試一下,打印的是。type類是Python類型系統的核心。用type作為一個判斷類型的函數使用是比較特殊的情況,或許是由歷史原因造成的,用typeof或許更合適。
如何構造一個類型
你肯定知道是用class語句。但是實際上,在Python核心看來,只有一種方式,那就是調用type的構造函數(因為type是一個類型)。當運行:
?
1 2 class A(object): def f(self): print 1Python解析器就會執行如下代碼所示功能:
?
1 2 3 def f(self): print 1 A=type('A', (object,), ) # 參數為(名字, 父類tuple,成員dict) del f兩者效果幾乎是一樣的,你可以試一下。
類型關系的確定除了使用type之外,還可以使用__class__屬性。如:
?
1 2 3 4 5 6 7 class A(object): pass a=A() a.__class__ # 'class __main__.A' A.__class__ # 'type ' type.__class__ # 'type ' type.__class__.__class__ # 'type ' type.__class__ is type.__class.__class__ # True繼承關系
繼承關系只發生在類型之間,繼承關系構成一個有向圖。所有的類型都是從object繼承來的。“所有的”當然也包括type。object的父類還是object。object作為一個類型對象也是有其類型的,這個類型就是type。所以object和type之間的關系就好比先有雞還是先有蛋的問題了:type是從object繼承的(繼承關系);object是由type生成的(類型關系)。通過issubclass或者__bases__屬性來判斷兩個類之間的繼承關系。
那麼從type繼承意味著什麼呢?那意味著這個類的類型是type,同時父類也是type。但是這種做法在一般的編程中是沒有什麼意義的(卻是meta programmming的核心)。因為一般都用class語句,而不是通過調用type的構造函數來創建類型對象。為了說明語法還是舉個例子:
?
1 2 3 4 5 class mytype(type): pass A=mytype('A', (object,), {}) # del f A.__class__ # class '__main__.mytype',元類為mytype mytype.__class__ # 'type '在用class定義一個類時,會間接調用type的構造函數。但是通過設置__metaclass__屬性,可以不去調用type,而是調用type的子類。如:
?
1 2 3 class A(object): __metaclass__ = mytype A.__class__ # class '__main__.mytype' ,和上面的方式結果一樣。由此,Python對象的類型關系組成了一個樹型結構,其中type處於樹的根部,由type或者type的子類構造的類型,包括class定義的類(間接調用type),調用type、type的子類構造函數創建的類,int list等系統定義類型處於中間節點,葉節點為instance對象。type本身的類型是什麼呢?還是type。這和根目錄的父目錄還是根目錄是一樣的。
Classic類不同於New Style類的地方就是當用class創建一個類時,不是間接調用type,而是間接調用types.ClassType,而types.ClassType是由type創建的。
?
1 2 3 4 class A: pass type(A) # type 'classobj',注意沒有__class__屬性。 type(A) is types.ClassType # True types.ClassType.__class__ # 'type'希望本文所述對大家的Python程序設計有所幫助。