91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python萬物皆對象源碼分析

發布時間:2022-05-18 09:23:47 來源:億速云 閱讀:157 作者:zzz 欄目:開發技術

這篇文章主要講解了“Python萬物皆對象源碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python萬物皆對象源碼分析”吧!

    萬物皆對象

    這篇博客的內容主要是針對Python中萬物皆對象的理解,對Python的類型、對象體系做一個整體的梳理。

    在Python中,一切皆為對象,一個整數是一個對象,一個字符串也是一個對象,基本類型(如int)也是對象。Python不再區別對待基本類型和對象,所有的基本類型內部均由對象實現。

    >>> a = int
    >>> b = 1
    >>> id(a)
    140734789683952
    >>> id(int)
    140734789683952
    >>> a
    <class 'int'>
    >>> id(b)
    2421963817200
    >>> id(1)
    2421963817200
    >>> b
    1

    1 類型對象和實例對象

    Python中的類型是一種對象,稱為類型對象。整數類型、字符串類型,以及我們通過class關鍵字定義的自定義類型也是一個對象。

    通過類實例化可以得到一個實例化對象,稱為實例對象

    Python萬物皆對象源碼分析

    2 類型、對象體系

    2.1 元類型type

    前面我們提到:Python中的類型是一種對象,稱為類型對象。那么類型對象的類型又是什么呢?

    >>> type(int)
    <class 'type'>
    >>> int.__class__
    <class 'type'>

    可以看到,類型的類型是type,我們稱之為元類型,但是這個類型比較特殊,它的實例對象是類型對象。此外,Python中還有一個特殊的類型object,所有其他類型都繼承于object,即object是所有類型的基類。

    圖示如下:

    Python萬物皆對象源碼分析

    2.2 自定義類型

    除了Python的內置類型,我們自定義一個類型MyClass,同樣地,可以得到:

    Python萬物皆對象源碼分析

    2.3 自定義類型子類

    再定義一個類型MySubClass,該類型為MyClass的子類:

    Python萬物皆對象源碼分析

    2.4 type和object的關系

    在上述示例中,我們描述了不同對象、類型之間的繼承、類型關系,但是對于兩個特殊的類型type和object的關系并沒有指出,我們先來打印看一下:

    >>> type(type)
    <class 'type'>
    >>> type(object)
    <class 'type'>
    >>> type.__base__
    <class 'object'>
    >>> object.__base__
    >>> print(object.__base__)
    None

    可以看到:object的類型也是type,type本身的類型也是type;而type的父類也是所有對象的父類&mdash;&mdash;object,而object本身沒有父類。由此我們可以歸納出:

    object是所有類型的基類(除了它自己),本質上是一種類型,其類型是type,同時也是type的基類;

    type是所有類型的類型,本質上是一種類型,其類型是它自己,也是object的類型;

    注:object本身不能有基類,這是因為&mdash;&mdash;對于存在繼承關系的類,成員屬性和成員方法查找需要回溯繼承鏈,不斷查找基類。因此,繼承鏈必須有一個終點,不然就會死循環。

    最后我們把type和object的關系補充進來:

    Python萬物皆對象源碼分析

    3 可變對象與不可變對象

    可變對象在創建之后,其值可以修改;不可變對象在創建之后,其值不可以進行修改。

    以Python中的整數對象為例:整數類型是不可變類型,整數對象是不可變對象。“修改整數對象”時,Python將以新值創建一個新對象,變量名與新對象進行綁定,舊對象如果沒有其他引用,則會被釋放(通過“小整數池”進行創建回收優化,具體后續介紹,這里先按下不表,后續會補充)。

    圖示如下:

    Python萬物皆對象源碼分析

    以Python中的列表對象為例:列表類型是可變類型,列表對象是可變對象。列表對象內部會維護一個動態數組,存儲元素對象的指針,列表對象再增減對象的時候,會修改該數組,而列表對象的“頭部”(后續會詳細介紹)會保持不變:

    Python萬物皆對象源碼分析

    4 變長對象和定長對象

    定長對象:對象的內存大小一定

    邊長對象:同一類型,不同對象會有不同的大小

    通過sys.getsizeof()可以查看一個對象的大小:

    >>> import sys
    >>> a = 1
    >>> b = 1111111111111111111111111111111111111111111111111111111111
    >>> c = 1.0
    >>> d = 1.00000000000000000000000000000000000000000000000000000001
    >>> sys.getsizeof(a)
    28
    >>> sys.getsizeof(b)
    52
    >>> sys.getsizeof(c)
    24
    >>> sys.getsizeof(d)
    24

    整數對象是變長對象:固定位數的整數能夠表示的范圍是有限的,故整數對象會隨著自身的數值大小而改變自身內存大小。在Python中采用了類似C++中大整數類的思路實現整數對象,通過串聯多個普通32位整數來支持更大的數值范圍(詳細源碼后續介紹)。

    浮點數對象是定長對象:根據機組的知識,我們用32位表示單精度浮點數,用64位表示雙精度浮點數,它們都是定長的。在Python中,浮點數背后是由一個double來實現的,就算表示很大的數,浮點數對象的大小也不變(這樣做的代價是犧牲了精度)。當然,浮點數也是有大小限制的,可以思考下:我們通過float()將一個很大的int轉化為float時,是否會報錯?Python底層是否做了相應的判斷呢?

    5 補充

    變量名:我們創建對象時會為對象分配對應的內存空間,那么我們將變量名和對象綁定時,變量又是如何存儲的呢?

    感謝各位的閱讀,以上就是“Python萬物皆對象源碼分析”的內容了,經過本文的學習后,相信大家對Python萬物皆對象源碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    军事| 崇阳县| 馆陶县| 大邑县| 新营市| 鄂伦春自治旗| 阜南县| 乃东县| 刚察县| 娱乐| 汉中市| 吉木萨尔县| 文水县| 高邮市| 阿拉善左旗| 瓦房店市| 新泰市| 河津市| 杨浦区| 家居| 绥德县| 龙泉市| 永善县| 靖江市| 仁怀市| 阿荣旗| 景德镇市| 临潭县| 三门县| 泉州市| 安多县| 民丰县| 丰宁| 江口县| 石嘴山市| 赞皇县| 新民市| 博湖县| 从化市| 泾阳县| 龙里县|