Python 元類別實例解析_python

不言
發布: 2018-04-04 16:14:29
原創
1242 人瀏覽過

這篇文章主要介紹了Python 元類實例解析,此文的主要任務就是給大家徹底講明白什麼是元類,需要的朋友可以參考下

龜叔發明了Python,然後整合了一堆概念在這門語言裡面,例如:迭代器,裝飾器,函數,生成器,類,對象,協程等等。

這些概念對初學者似乎沒一個好懂的,不過還有比這更難的概念,它是Python 世界中的造物主,雖然我們很少去直接使用它,但天天都在用,它就是今天的主角------元類。

今天我的任務就是徹底明白什麼是元類,一起看看。

要搞懂元類,我們還是先從物件說起。

物件(Object)

Python 一切皆對象,這句話你一定聽過(現在你就聽說了) ,一個數字是對象,一個字串是對象,一個列表是對象,一個字典是對象,例如:


#
>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}
登入後複製


##等號右邊是對象,左邊是給這些對象取的名字,任何對像都有3個關鍵屬性:標識、值、類型。

標識

標識就和人的身分證ID一樣,每個物件都有唯一ID標識,在整個生命週期中都不會變,你可以認為標識是這個物件在電腦記憶體中的位址。透過函數 id() 可以查看物件的ID識別。


>>> id(i)
40592592
>>> id(s)
44980584
登入後複製


#物件值

物件的第二個屬性是值,值很好理解,例如i 的值是10,s 的值是abc,nums 的值就是1,2,3。

類型

物件還有一個很重要的屬性就是類型,任何物件都有屬於自己的類型,物件就是由它的類型建構出來的,例如上面的i 的類型是int 類型,這個物件就是由int 建構出來的。 s 類型是字串類型,nums 的類型是列表類型,dicts 的類型是字典類型,它們都是由對應的類型建構出來的。

透過 type() 可以查看物件的型別。


>>> type(i)
<class &#39;int&#39;>
>>> type(s)
<class &#39;str&#39;>
>>> type(nums)
<class &#39;list&#39;>
>>> type(dicts)
<class &#39;dict&#39;>
登入後複製


物件的型別也和ID標識一樣,確定好之後就不會再改變了。

類別與(實例)物件

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


>>> class Person:
  # 这里的 self 指某个实例对象自己
...  def __init__(self, name):
   # name 是实例的属性
...   self.name = name
  # live 是类的属性
  live = True
登入後複製


這裡的Person 是自訂類,類別是抽象的模版,既不指張三也不是李四,現在我們可以透過呼叫這個類別來建構(實例化)出一個具體的,實在的,有名字的物件出來,這個物件稱之為實例物件。


>>> p1 = Person("zhangsan")
>>> p1.name
&#39;zhangsan&#39;
>>>
>>> p2 = Person("lisi")
>>> p2.name
&#39;lisi&#39;
登入後複製


這裡的p1、p2 就是實例化之後的(實例)對象,這兩個物件的類型都是Person 類,類別與(實例)物件的關係就像一個車輛模具與一輛被造出來的真實車的關係一樣。


>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class &#39;__main__.Person&#39;> # 这里的__main__是模块名称
登入後複製


#類別也是物件(又叫類別物件)

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

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


>>> id(Person)
26564024
>>> type(Person)
<class &#39;type&#39;>
>>> Person
<class &#39;__main__.Person&#39;>
登入後複製


我們注意到這個Person 這個類別物件的型別叫“type”,也就是說Person 類別是由type創建出來的,現在你要記住,p1,p2 是實例對象,而Person 是類別對象。另外,這個 type 是什麼鬼?

我們來回顧一下,實例物件p1 的型別是類別物件Person,Person 的型別type


>>> nums = [1,2,3]
>>> type(nums)
<class &#39;list&#39;>
>>> type(list)
<class &#39;type&#39;>
登入後複製


nums 的型別是list,list 的型別也是type,字典類別(dict)的型別也是type,所有類別的型別都是type,也就是說所有的類別都是由type 建立的。這個 type 就是元類,道生一,一生二,三生萬物,元類就是 Python 中的創造者。 (元類別自己也是物件)

現在我們都知道類別(物件)可以使用class 關鍵字創建,我們也知道類別(物件)的類型是type,既然知道了它的類型是type,那麼肯定可以透過type(元類別)來創建。

用元類別建立類別#

前面讲到过,type 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。


>>> Person = type("Person", (), {"live":True})
>>> Person
<class &#39;__main__.Person&#39;>
登入後複製


Person 就是一个类,它等价于:


>>> class Person:
...  live = True
...
>>> Person
<class &#39;__main__.Person&#39;>
登入後複製


用元类 type 创建类的语法是:

type(类名,基类元组(可以为空), 属性字典)

总结

以上所述是小编给大家介绍的 Python 元类实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!


相关推荐:

Python解析JSON的实例分享

分析Python解析XML的几种方式


以上是Python 元類別實例解析_python的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板