在python中對象、類型和元類構成了一個微妙的世界。
他們有在這個世界里和平共處,相輔相成。它們遵循着幾條亘古不變的定律:
1、python中無處不對象
2、所有對象都有三種特性:id、類型、值
3、每個對象都是由其對應的類創建出來的
下面來逐條進行分析:
1、python中無處不對象
對象是python中對數據的一種抽象的表示。所有能夠通過PyObject類型的指針訪問的都是對象。
python中的int、tuple、list、dict、set、函數、類以及派生類都是對象,當然類實例化的對象就更應該是對象了吧(這個都不知道的好,語文老師會氣死的……………………)。
2、所有對象都有三種特性:id、類型、值
id 其實就是對象在內存中存放的地址。也就是說在內存中開辟了一塊空間,用來存放對象的。id其實就相當於你在內存中的身份標識。用內置函數id()可以查詢對象的id。
id('a') 2330255367896
類型是生成對象的模型,相當於對象的父母。可以用type()來查看
>>> type('a')
<class 'str'>
值就是對象中存放的數據。值也是對象的價值所在。所有對象存在的意義就是為了保存各種各樣的值。有的對象不會改變,叫不可變對象,例如:數值、字符串、元組。對象的值可以改變的對象叫可變對象,例如:列表,集合,字典。
3、每個對象都是由其對應的類創建出來的
遵循第一條定律,其實模型也是對象,它是由它的父母產生的,它的父母是誰呢?查看方法是一樣的。
>>> class A(object):
pass
>>> a= A()
>>> type(a)
<class '__main__.A'>
>>> type(A)
<class 'type'>
>>> A.__bases__
(<class 'object'>,)
這里涉及了一個區別:
在py2.X中,新式類需要繼承object類,而在py3.x中已經做了更改,在創建所有的類的時候都會默認繼承object類。
#py2.79 >>> class A: ... pass ... >>> A.__bases__ () >>> class B(object): ... pass ... >>> B.__bases__ (<type 'object'>,) >>>
#py3.6 >>> class A: pass >>> A.__bases__ (<class 'object'>,)
這里又出現了兩個問題:
1,object類是什么?
2,繼承是什么?
我們先說第二個問題:
類可以繼承和派生,被繼承的類叫超類,父類或者基類(管它怎么叫呢,我們只有知道,它是繼承它的類的父母就可以了。。。),繼承者叫子類或者派生類(叫什么無所謂,反正它是它父母的孩子,本質是不會改變的。。。PS:這里我說句題外話,某些人經常不認自己的父母或孩子,可是你們永遠改變不了你們的血緣關系。)。還可以實現多繼承,多繼承就是一個子類繼承多個父類(現在的社會很多孩子的父親是不確定的,但是類關系確實明確的。。呵呵....又扯遠了,我對這個社會是有多么深的怨念啊。)下面還是用實例說話吧。
>>> class A: pass >>> class B: pass >>> class C(A): pass >>> class D(A,B): pass
在這段代碼中,C類繼承A類,在這個關系中,A就是父類,C就是A的子類。D類同時繼承了A類和B類,A類和B類是父類,D同時繼承了A和B,所以即時A的子類又是B的子類。
當然繼承的知識還有很多,自己可以查一下相關的資料。
再來說說第一個問題:
object類是所有的類的祖宗。這個object其實也是一個對象(python中處處皆對象)。但是這個對象又有一些特別,其他的對象都是一個抽象的對象,而這個object卻是一個具體存在的。其他的類或者對象都是通過繼承的關系,直接或者間接的繼承了object。翻閱所有對象的族譜,最后一定會發現它們的老祖宗就是object。
對象和類型都說完了,剩下的就是說一說元類了。
首先,什么是元類呢?
list,str,int 這些類型是由誰創建的呢。對了,就是元類。元類創建的類不是一般定義的類,它創建的是模版。最根溯源,我們會找到一個特殊的元類,就是type。但是問題又來了我,我們查看type的類型的時候,發現type是由它自身創建的。
>>> type(list) <class 'type'> >>> type(type) <class 'type'> >>>
難道它既是父親,又是兒子?why?好吧,我們換種查詢方式。
>>> type.__bases__ (<class 'object'>,)
其實type是以object為模版創建的。
是不是解釋通了呢?別着急,如果你足夠細心,你還會發現一個小問題。
>>> type(object) <class 'type'> >>>
what? object是由type創建的?
其實創建它們的是一個叫虛擬機的家伙。它是來自另一個世界的。。