首頁  >  文章  >  後端開發  >  Python的元類別如何使用

Python的元類別如何使用

php中世界最好的语言
php中世界最好的语言原創
2018-04-09 15:57:021536瀏覽

這次帶給大家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
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'

這裡的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(类名,基类元组(可以为空), 属性字典)

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Python实现求解最大公约数的方法

在python中numpy与array应该怎样转换

以上是Python的元類別如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn