<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          它是Python造物主,一篇文章理解最難懂的概念

          共 3210字,需瀏覽 7分鐘

           ·

          2021-09-18 12:45

          這篇文章本來想引用在第一篇文章里,發(fā)現(xiàn)不知道什么時候被我刪除了,肯定是刪廣告的時候手抖誤刪了,當時寫這篇文章閱讀量還比較高,推薦給大家。


          龜叔發(fā)明了 Python,然后集成了一堆概念在這門語言里面,比如:迭代器,裝飾器,函數(shù),生成器,類,對象,協(xié)程等等。

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

          今天我的任務就是徹底明白什么是元類,看懂了別忘了給我點個贊,分享給更多人。

          要搞懂元類,我們還是先從對象說起。

          對象(Object)

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

          >>> i = 10
          >>> s = "abc"
          >>> nums = [1,2,3]
          >>> dicts = {"name":"zhang"}

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

          標識

          標識就和人的身份證ID一樣,每個對象有唯一ID標識,在整個生命周期中都不會變,你可以認為標識是這個對象在計算機內存中的地址。通過函數(shù) id() 可以查看對象的ID標識。

          >>> id(i)
          40592592
          >>> id(s)
          44980584

          對象值

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

          類型

          對象還有一個很重要的屬性就是類型,任何對象都有屬于自己的類型,對象就是由它的類型構造出來的。

          比如上面 i 的類型是 int 類型,s 類型是字符串類型,nums 的類型是列表類型,dicts 的類型是字典類型,它們都是由對應的類型構建出來的。

          通過 type() 可以查看對象的類型。

          >>> type(i)
          <class 'int'>
          >>> type(s)
          <class 'str'>
          >>> type(nums)
          <class 'list'>
          >>> type(dicts)
          <class 'dict'>

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

          類與(實例)對象

          除了系統(tǒng)已經定義好了的整數(shù)類型,字符串類型,列表等類型之外,我們還可以創(chuàng)建自己的類型,用關鍵字 class 來定義。例如:

          >>> class Person:
                 # 這里的 self 指某個實例對象自己
          ...    def __init__(self, name):
                     # name 是實例的屬性
          ...        self.name = name
                 # live 是類的屬性
                 live = True

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

          >>> p1 = Person("zhangsan")
          >>> p1.name
          'zhangsan'
          >>>
          >>> p2 = Person("lisi")
          >>> p2.name
          'lisi'

          這里的 p1、p2 就是實例化之后的(實例,instance)對象,這兩個對象的類型都是 Person 類,類與(實例)對象的關系就像一個車輛模具與一輛被造出來的真實車的關系一樣。

          >>> p1
          <__main__.Person object at 0x0195AA30>
          >>> type(p1)
          <class '__main__.Person'> # 這里的__main__是模塊名稱

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

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

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

          >>> id(Person)
          26564024
          >>> type(Person)
          <class 'type'>
          >>> Person
          <class '__main__.Person'>

          我們注意到這個 Person 這個類對象的類型叫 “type”,也就是說 Person 類是由 type 創(chuàng)建出來的,現(xiàn)在你要記住,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 創(chuàng)建的。這個 type 就是元類(metaclass),元類是用于創(chuàng)建類的類,道生一,一生二,三生萬物,元類就是 Python 中的造物主。(元類自己也是對象)


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

          用元類創(chuàng)建類

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

          >>> Person = type("Person", (), {"live":True})
          >>> Person
          <class '__main__.Person'>

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

          >>> class Person:
          ...    live = True
          ...
          >>> Person
          <class '__main__.Person'>

          用元類 type 創(chuàng)建類的語法是:

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

          那么元類到底有什么用處呢?我們真的需要元類嗎?請關注下回講解,(留給大家多些時間消化,O(∩_∩)O)

          小結

          Python中一切皆為對象,類是對象,元類也是對象,元類是用于創(chuàng)建類的類。


          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日天天色天天干 | 亚洲精品系列 | 亚洲色视 | 天堂中文字幕在线观看 | 亚洲在钱免费观看 |