成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度解密 Python 的浮點數是怎么實現的?

開發 前端
假設我們要將兩個浮點數相加,相信你已經知道解釋器會如何做了?通過 PyFloat_AsDouble 將兩個浮點數的 ob_fval 抽出來,然后相加,最后再根據相加的結果創建一個新的 PyFloatObject 即可。

楔子

從現在開始,我們就來分析 Python 的內置對象,看看它們在底層是如何實現的。但說實話,我們在前面幾篇文章中介紹對象的時候,已經說了不少了,不過從現在開始要進行更深入的分析。

除了對象本身,還要看對象支持的操作在底層是如何實現的。我們首先以浮點數為例,因為它是最簡單的,沒錯,浮點數比整數要簡單,至于為什么,等我們分析整數的時候就知道了。

浮點數的底層結構

要想搞懂浮點數的實現原理,就要知道它在底層是怎么定義的,當然在這之前我們已經見過它很多遍了。

// Include/cpython/floatobject.h
typedef struct {
    PyObject_HEAD
    double ob_fval;
} PyFloatObject;

它包含了一個公共頭部 PyObject 和一個 double 類型的 ob_fval 字段,毫無疑問這個 ob_fval 字段負責存儲浮點數的具體數值。

我們以 e = 2.71 為例,底層結構如下。

圖片圖片

還是很簡單的,每個對象在底層都是由結構體表示的,這些結構體中有的字段負責維護對象的元信息,有的字段負責維護具體的值。比如這里的  2.71,總要有一個字段來存儲 2.71 這個值,而這個字段就是 ob_fval。所以浮點數的結構非常簡單,直接使用一個 C 的 double 來維護。

假設我們要將兩個浮點數相加,相信你已經知道解釋器會如何做了?通過 PyFloat_AsDouble 將兩個浮點數的 ob_fval 抽出來,然后相加,最后再根據相加的結果創建一個新的 PyFloatObject 即可。

浮點數是怎么創建的

下面來看看浮點數是如何創建的,在前面的文章中,我們說對象可以使用對應的特定類型 API 創建,也可以通過調用類型對象創建。

調用類型對象 float 創建實例對象,解釋器會執行元類 type 的 tp_call,它指向了 type_call 函數。然后 type_call 內部會先調用類型對象(這里是 float)的 tp_new 為其實例對象申請一份空間,申請完畢之后對象就已經創建好了。然后再調用 tp_init,并將實例對象作為參數傳遞進去,進行初始化,也就是設置屬性。

但是對于 float 來說,它內部的 tp_init 字段為 0,也就是空。

圖片圖片

這就說明 float 沒有 __init__,因為浮點數太過簡單,只需要一個 tp_new 即可。我們舉個例子:

class Girl1:

    def __init__(self, name, age):
        self.name = name
        self.age = age

# __new__  負責開辟空間、生成實例對象
# __init__ 負責給實例對象綁定屬性

# 但其實 __init__ 所做的工作可以直接在 __new__ 當中完成
# 換言之有 __new__ 就足夠了,其實可以沒有 __init__
# 我們將上面的例子改寫一下
class Girl2:

    def __new__(cls, name, age):
        instance = object.__new__(cls)
        instance.name = name
        instance.age = age
        return instance

g1 = Girl1("古明地覺", 16)
g2 = Girl2("古明地覺", 16)
print(g1.__dict__ == g2.__dict__)  # True

我們看到效果是等價的,因為 __init__ 負責給 self 綁定屬性,而這個 self 是 __new__ 返回的。那么很明顯,我們也可以在 __new__ 當中綁定屬性,而不需要 __init__。

責任編輯:武曉燕 來源: 古明地覺的編程教室
相關推薦

2020-09-15 12:57:46

C 語言浮點數內存

2023-07-05 08:00:58

Redis數據庫

2018-08-24 10:16:23

內存浮點數存儲

2017-10-16 10:42:27

前端JavaScript浮點數

2011-05-25 14:10:38

浮點數

2020-10-12 06:38:08

存儲定點數

2010-07-22 17:39:44

2015-12-02 10:21:34

JavaScript浮點數精度調整

2010-01-15 15:21:35

C++

2021-10-19 14:04:28

C++類型數字

2009-05-19 10:10:01

Oracle時間加減時間操作

2024-07-11 15:50:36

2024-08-23 08:43:08

2021-11-15 09:32:06

浮點面試Java

2022-06-15 15:44:21

無損數據壓縮鴻蒙

2025-04-01 07:50:00

Dinero.js前端開發

2024-08-02 11:33:49

2024-09-05 10:49:42

2024-09-18 13:49:42

2022-09-16 07:24:12

Python 的四舍
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久7电影 | 精品国产乱码久久久久久1区2区 | 成人精品毛片国产亚洲av十九禁 | 国产1区2区在线观看 | 国产乱码精品一区二区三区av | 中文字幕欧美一区二区 | 国产一级成人 | 成人免费精品视频 | 国产精品一区二区欧美黑人喷潮水 | 国产精品久久久久久久久 | 91 中文字幕 | 成人精品国产一区二区4080 | 91正在播放 | 色吊丝2| 国产综合精品一区二区三区 | 91视视频在线观看入口直接观看 | 亚洲综合精品 | 亚洲精品一区国产精品 | 久久亚洲综合 | 自拍偷拍视频网 | 草久视频 | 久久久久久国产精品免费免费狐狸 | 国产高清视频一区二区 | 欧美日韩在线免费观看 | 999久久久久久久久 国产欧美在线观看 | 欧美午夜一区 | 嫩草视频入口 | 国产激情一区二区三区 | 日韩一区二区三区在线观看视频 | 我想看国产一级毛片 | 欧美高清一区 | 精品九九九 | 色综合一区二区三区 | 亚洲国产成人av好男人在线观看 | 性国产丰满麻豆videosex | 国产91精品网站 | 91免费在线 | 一级高清 | 鸡毛片 | 国产精品久久久久久 | 天天操操操操操 |