這次帶給大家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 'int'> >>> type(s) <class 'str'> >>> type(nums) <class 'list'> >>> type(dicts) <class 'dict'>
物件的類型也和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 'main.Person'> # 这里的main是模块名称
類別也是物件(又叫類別物件)
#剛剛我們說了一切都是對象,實例(真實車)是對象,類別(模具)當然也是對象,因為它也是個實實在存在的東西,
當Python 解釋器執行到關鍵字class 這個指令的時候,在內部就會創建一個名為"Person " 的類,這個類也是個對象,我們稱之為類對象(注意區別實例對象),它一樣有ID標識、有型別、有值。例如:
>>> id(Person) 26564024 >>> type(Person) <class 'type'> >>> Person <class 'main.Person'>
我們注意到這個Person 這個類別物件的型別叫“type”,也就是說Person 類別是由type 建立出來的,現在你要記住,p1,p2 是實例對象,而Person 是類別物件。另外,這個 type 是什麼鬼?
我們來回顧一下,實例物件p1 的型別是類別物件Person,Person 的型別type
>>> nums = [1,2,3] >>> type(nums) <class 'list'> >>> type(list) <class 'type'>
nums 的型別是list,list 的型別也是type,字典類別(dict)的類型也是type,所有類別的類型都是type,也就是說所有的類別都是由type 建立的。這個 type 就是元類,道生一,一生二,三生萬物,元類就是 Python 中的創造者。 (元類別自己也是物件)
现在我们都知道类(对象)可以使用 class 关键字创建,我们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么肯定可以通过 type(元类)来创建。
用元类创建类
前面讲到过,type 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。
>>> Person = type("Person", (), {"live":True}) >>> Person <class 'main.Person'>
Person 就是一个类,它等价于:
>>> class Person: ... live = True ... >>> Person <class 'main.Person'>
用元类 type 创建类的语法是:
type(类名,基类元组(可以为空), 属性字典)
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是Python的元類別如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!