Python中的對象、類、元類__Python

來源:互聯網
上載者:User
龜叔發明了Python,然後整合了一堆概念在這門語言裡面,比如:迭代器,裝飾器,函數,產生器,類,對象,協程等等。
這些概念對初學者似乎沒一個好懂的,不過還有比這更難的概念,它是Python世界中的造物主,雖然我們很少去直接使用它,但天天都在用,它就是今天的主角--元類。
要搞懂元類,我們還是先從對象說起。
對象(Object)Python中一切皆對象,這句話你一定有聽說過(現在你就聽說了),一個數字是對象,一個字串是對象,一個列表是對象,一個字典是對象,例如:
i=10s='abc'nums=[1,2,3]dicts={"name":"zeng"}
等號右邊是對象,左邊是給這些對象取的名字,任何對象都有3個關鍵屬性:標識、值、類型。
標識
標識就和人的身份證ID一樣,每個對象有唯一ID標識,在整個生命週期中都不會變,你可以認為標識是這個對象在電腦記憶體中的地址。通過函數 id()可以查看對象的ID標識。
print("對象的唯一標識為:"+str(id(i)))
對象的唯一標識為:1704834400
print("對象的唯一標識為:"+str(id(dicts)))
對象的唯一標識為:1918903679592
對象值
對象的第二個屬性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。
類型
對象還有一個很重要的屬性就是類型,任何對象都有屬於自己的類型,對象就是由它的類型構造出來的。
比如上面i的類型是int類型,s的類型是字串類型,nums的類型是清單類型,dicts的類型是字典類型,它們都是由對應的類型構建出來的。
通過type()可以查看對象的類型。
print("對象的類型為:"+str(type(i)))
print("對象的類型為:"+str(type(dicts)))
對象的類型為:<class 'int'>
對象的類型為:<class 'dict'>

對象的類型也和ID標識一樣不會改變。唯一可能變的就是值。

除了系統已經定義好了的整數類型,字串類型,列表等類型之外,我們還可以建立自己的類型,用關鍵字class來定義。例如:

 
 
class Person(object):    #__init__()有點像建構函式,執行個體化類時調用    def __init__(self,name,gender):    #name是執行個體的屬性        self.name = name        self.gender = gender    #live是類的屬性    live = True

這裡的 Person 就是自訂類,類是一個抽象的模版,既不是指張三也不是李四等具體的人,現在我們可以通過調用這個類來構造(執行個體化)出一個具體的,實在的,有名字的對象出來,這個對象稱之為執行個體對象(Instance)。

類與(執行個體)對象

 
p1 = Person ("zhangan","男")print(p1.name)p2 = Person ("lisi","女")print(p2.name)
zhanganlisi

這裡的 p1、p2 就是執行個體化之後的(執行個體instance)對象,這兩個對象的類型都是 Person 類,類與(執行個體)對象的關係就像一個車輛模具與一輛被造出來的真實車的關係一樣。如下所示:

print(p1)print(id(p1))print(type(p1))
<__main__.Person object at 0x000002031271BBE0>2212217600992<class '__main__.Person'>

類也是對象(又叫類對象)

剛剛我們說了一切都是對象,執行個體(真實的車)是對象,類(模具車)當然也是對象,因為它也是實實在在存在的東西。

當 Python 解譯器執行到關鍵字 class 這個指令的時候,在內部就會建立一個名為 “Person” 的類,這個類也是個對象,我們稱之為類對象(注意區別執行個體對象),它一樣有ID標識、有類型、有值。例如:

print(Person)print(id(Person))print(type(Person))
<class '__main__.Person'>2446546123192<class 'type'>
我們注意到Person這個類對象的類型叫“type”,也就是說Person類是由type建立出來的,現在你要記住,p1,p2 是執行個體對象,而Person是類對象,執行個體對象p1的類型是類對象Person,Person的類型是type。另外,這個type是什麼鬼。

我們來回顧一下:

i=10print("對象的類型為:"+str(type(i)))print("對象的類型為:"+str(type(int)))
對象的類型為:<class 'int'>對象的類型為:<class 'type'>
i的類型是int,int的類型也是type,所有類的類型都是type,也就是說所有的類都是由type建立的。這個type就是元類(metaclass),元類是用於建立類的類,道生一,一生二,三生萬物,元類就是Python中的造物主。(元類自己也是對象)

現在我們都知道類(對象)可以使用class關鍵字建立,我們還知道類(對象)的類型是type,既然知道了它的類型是type,那麼肯定可以通過type(元類)來建立。
用元類建立類

前面講到過,type有一個作用是用於檢查對象的類型,其實它還有另外一個作用就是作為元類動態地建立類(對象)。

Person1 = type("Person1", (), {"live":True})print(Person1)

Person就是一個類,它等價於:

class Person1:    live = Trueprint(Person1)
<class '__main__.Person1'>
用元類type建立類的文法是:

type(類名,父類元組(可以為空白), 屬性字典)

小結
Python中一切皆為對象,類是對象,元類也是對象,元類是用於建立類的類。


本文章參考公眾號【python之禪】,非常感謝。
連結:https://mp.weixin.qq.com/s/UTFQgu4q5pHFyQZBWA9qpA

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.