龜叔發明了 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'
新聞熱點
疑難解答