python中對象、類型和元類之間的關系


在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創建的?

其實創建它們的是一個叫虛擬機的家伙。它是來自另一個世界的。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM