校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Python源碼學(xué)習(xí)之PyObject和PyTypeObject

Python源碼學(xué)習(xí)之PyObject和PyTypeObject

熱門標(biāo)簽:洪澤縣地圖標(biāo)注 北京電信外呼系統(tǒng)靠譜嗎 無錫客服外呼系統(tǒng)一般多少錢 大連crm外呼系統(tǒng) 百度地圖標(biāo)注位置怎么修改 高德地圖標(biāo)注是免費的嗎 地圖標(biāo)注視頻廣告 梅州外呼業(yè)務(wù)系統(tǒng) 老人電話機(jī)器人

前言

Python是C語言實現(xiàn)的,因此Python對象在C語言層面應(yīng)該是一個結(jié)構(gòu)體 ,組織對象占用的內(nèi)存。 不同類型的對象,數(shù)據(jù)及行為均可能不同,因此可以大膽猜測:不同類型的對象由不同的結(jié)構(gòu)體表示

對象也有一些共性,比如每個對象都需要有一個引用計數(shù),用于實現(xiàn)垃圾回收機(jī)制。因此,還可以進(jìn)一步猜測:表示對象的結(jié)構(gòu)體有一個公共頭部

一. 實例對象的基石—PyObject和PyVarObject

PyObject和PyVarObject本質(zhì)上是對象的頭部信息

1.1 PyObject結(jié)構(gòu)體

Python對象都由PyObject結(jié)構(gòu)體表示,對象引用則是指針PyObject *PyObject結(jié)構(gòu)體定義于頭文件object.h,路徑為Include/object.h,代碼如下

typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;

對結(jié)構(gòu)體中的元素進(jìn)行說明,

元素名稱 說明
ob_refcnt 引用計數(shù),對象被其他地方引用時加一,引用解除時減一; 當(dāng)引用計數(shù)為零,便可將對象回收,這是最簡單的垃圾回收機(jī)制。
ob_type 類型指針指向?qū)ο蟮念愋蛯ο螅愋蛯ο竺枋鰧嵗龑ο蟮臄?shù)據(jù)及行為。
_PyObject_HEAD_EXTRA 宏,同樣定義在Include/object.h頭文件內(nèi)。

1.2 宏的定義

#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA            \

    struct _object *_ob_next;           \

    struct _object *_ob_prev;

#define _PyObject_EXTRA_INIT 0, 0,

#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif

如果Py_TRACE_REFS被定義,宏展開為兩個指針ob_nextob_prev用來實現(xiàn)雙向鏈表。注釋中說明,雙向鏈表用于跟蹤所有活躍堆對象,一般不啟用,不深入介紹。

1.3 PyVarObject結(jié)構(gòu)體

用于表示變長對象PyVarObject結(jié)構(gòu)體是在PyObject結(jié)構(gòu)體的基礎(chǔ)上加入長度信息。

typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

相比object結(jié)構(gòu)體增加了ob_size字段用于記錄元素個數(shù)。

1.4 兩種頭部信息宏定義及其初始化

具體實例對象視其內(nèi)存大小是否固定,決定其屬于定長對象還是變長對象。相應(yīng)的需要具有頭部信息PyObjectPyVarObject

因此,頭文件準(zhǔn)備了兩個頭部信息的宏定義PyObject_HEADPyObject_VAR_HEAD,方便對象使用,

#define PyObject_HEAD          PyObject ob_base;
#define PyObject_VAR_HEAD      PyVarObject ob_base;

宏定義說明,

#define PyObject_HEAD PyObject ob_base;
表示將代碼中其他出現(xiàn)PyObject_HEAD的地方,替換成PyObject ob_base;

1.4.1 定長對象實現(xiàn)

內(nèi)存大小固定的浮點數(shù)類的實現(xiàn)只需在PyObject頭部基礎(chǔ)上,用一個雙精度浮點數(shù)double加以實現(xiàn),

typedef struct {
    PyObject_HEAD

    double ob_fval;
} PyFloatObject;

1.4.2 變長對象實現(xiàn)

內(nèi)存大小不固定的列表對象則需要在PyVarObject頭部的基礎(chǔ)上,用一個動態(tài)數(shù)組加以實現(xiàn),數(shù)組存儲列表包含的對象,即 PyObject 指針,

typedef struct {
    PyObject_VAR_HEAD

    PyObject **ob_item;
    Py_ssize_t allocated;
} PyListObject;

PyListObject底層由一個數(shù)組實現(xiàn),關(guān)鍵字段是以下3個,

字段 說明
ob_item 指向動態(tài)數(shù)組的指針,數(shù)組保存元素對象指針。
allocated 動態(tài)數(shù)組總長度,即列表當(dāng)前的 容量。
ob_size 當(dāng)前元素個數(shù),即列表當(dāng)前的 長度。

列表容量不足時,Python會自動擴(kuò)容,具體機(jī)制見list源碼解讀。

1.4.3 頭部信息宏初始化

PyObject_HEAD_INIT用于定長對象頭部信息初始化。將引用計數(shù)ob_refcnt設(shè)置為1并將對象類型ob_type設(shè)置成給定類型。

#define PyObject_HEAD_INIT(type)        \

    { _PyObject_EXTRA_INIT              \

    1, type },

PyVarObject_HEAD_INIT用于變長對象頭部信息初始化。在前者基礎(chǔ)上進(jìn)一步設(shè)置長度字段ob_size

#define PyVarObject_HEAD_INIT(type, size)       \

    { PyObject_HEAD_INIT(type) size },

在源碼中經(jīng)常見到這兩個宏定義。

二. 類型對象的基石—PyTypeObject 2.1 PyTypeObject包含信息

PyObject記錄了Python中所有對象共有的信息。如引用計數(shù)、類型指針和變長對象特有的元素個數(shù)。但是還有一些細(xì)節(jié)需要考慮,

  • 創(chuàng)建不同類型的對象時如何得知對象所需的內(nèi)存信息
  • 給定某個對象,如何判斷它支持什么操作

這些作為對象的元信息 ,應(yīng)該由一個獨立實體保存,與對象所屬類型密切相關(guān)。PyObject中包含的ob_type指針,指向一個類型對象。類型對象PyTypeObject也在Include/object.h中定義,關(guān)鍵字段如下,

typedef struct _typeobject {
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "module>.name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */
    destructor tp_dealloc;
    printfunc tp_print;

    getattrfunc tp_getattr;
    setattrfunc tp_setattr;

    // ...
    /* Attribute descriptor and subclassing stuff */
    struct _typeobject *tp_base;

    // ......
} PyTypeObject;

類型對象PyTypeObject是一個變長對象,包含變長對象頭部信息PyObject_VAR_HEAD和專有字段,

字段 說明
類型名稱 tp_name字段
類型的繼承信息 tp_base字段指向基類對象
創(chuàng)建實例對象時所需的內(nèi)存信息 tp_basicsize 和 tp_itemsize 字段
該類型支持的相關(guān)操作信息 tp_print、tp_getattr等函數(shù)指針

PyTypeObject就是類型對象在 Python 中的表現(xiàn)形式,對應(yīng)著面向?qū)ο笾小邦悺钡母拍睢?code>PyTypeObject結(jié)構(gòu)很復(fù)雜,目前只需要知道它保存著對象的元信息,描述對象的類型即可。

2.2 類型對象和實例對象在內(nèi)存中的關(guān)系

以float為例,考察類型對象和實例對象在內(nèi)存中的形態(tài)和關(guān)系,

>>> float
class 'float'>
>>> pi = 3.14
>>> e = 2.71
>>> type(pi) is float
True

  • 兩個float實例對象都是PyFloatObject結(jié)構(gòu)體,除了公共頭部字段ob_refcntob_type,專有字段ob_fval保存了對應(yīng)的數(shù)值。
  • 類型對象是一個PyTypeObject結(jié)構(gòu)體,保存了類型名、內(nèi)存分配信息以及浮點數(shù)相關(guān)操作。實例對象的ob_type字段指向類型對象,Python 據(jù)此判斷對象類型,進(jìn)而獲悉關(guān)于對象的元信息。
  • float、pi以及e等變量只是一個指向?qū)嶋H對象的指針。

上圖的內(nèi)容并不完全正確,更深入的解讀見后一篇博文。

到此這篇關(guān)于Python源碼學(xué)習(xí)之PyObject和PyTypeObject的文章就介紹到這了,更多相關(guān)PyObject和PyTypeObject內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python源碼解析之List
  • python源碼剖析之PyObject詳解
  • python opencv人臉識別考勤系統(tǒng)的完整源碼
  • python 制作手機(jī)歸屬地查詢工具(附源碼)
  • python基于tkinter制作無損音樂下載工具(附源碼)
  • Python bsonrpc源碼解讀
  • Python源碼學(xué)習(xí)之PyType_Type和PyBaseObject_Type詳解
  • Python制作腳本幫女朋友搶購清空購物車

標(biāo)簽:洛陽 怒江 安慶 吉林 岳陽 清遠(yuǎn) 泉州 長春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python源碼學(xué)習(xí)之PyObject和PyTypeObject》,本文關(guān)鍵詞  Python,源碼,學(xué),習(xí)之,PyObject,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python源碼學(xué)習(xí)之PyObject和PyTypeObject》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python源碼學(xué)習(xí)之PyObject和PyTypeObject的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲午夜国产一区99re久久| 一个色在线综合| 欧美日韩一区中文字幕| 国产不卡在线一区| 天天影视色香欲综合网老头| 亚洲欧洲精品天堂一级| 精品国产免费人成电影在线观看四季| 972aa.com艺术欧美| 国产精品一区久久久久| 日韩高清一区在线| 亚洲精品免费视频| 欧美国产1区2区| 久久久久久久国产精品影院| 欧美丰满少妇xxxbbb| 91国模大尺度私拍在线视频| 国产成人精品影院| 韩国一区二区在线观看| 亚洲成人激情综合网| 亚洲欧美日韩久久精品| 中文字幕中文字幕一区| 国产亚洲综合色| 精品国产区一区| 欧美成人女星排名| 91精品国产综合久久精品| 欧美日韩在线播放一区| 欧美影院午夜播放| 91搞黄在线观看| 在线观看亚洲精品| 欧美亚洲尤物久久| 欧美日韩在线不卡| 欧美三级韩国三级日本三斤 | 美国三级日本三级久久99| 亚洲成人一二三| 亚洲www啪成人一区二区麻豆| 亚洲黄色小说网站| 亚洲在线一区二区三区| 亚洲精品中文在线影院| 自拍偷自拍亚洲精品播放| 国产精品护士白丝一区av| 亚洲国产精品成人综合色在线婷婷 | 国产一区二区福利视频| 另类人妖一区二区av| 久久精品国产成人一区二区三区 | 99视频有精品| 91丨porny丨中文| 99久久777色| 在线视频观看一区| 7777精品伊人久久久大香线蕉 | 欧美精品一区二区三区蜜桃 | 成人av先锋影音| 99精品在线免费| 欧美在线free| 欧美高清你懂得| 欧美第一区第二区| 久久久久久亚洲综合影院红桃| 久久久久久久久久久电影| 中文无字幕一区二区三区 | 亚洲国产色一区| 日本三级韩国三级欧美三级| 麻豆国产精品视频| 国产一区二区三区在线观看精品| 成人综合婷婷国产精品久久蜜臀| 91香蕉视频污在线| 在线播放欧美女士性生活| 亚洲精品一区二区三区蜜桃下载| 欧美韩日一区二区三区四区| 亚洲视频免费在线观看| 午夜不卡av免费| 国产一区欧美二区| 91在线视频播放| 欧美一卡二卡在线观看| 国产精品视频一二| 亚洲国产日韩综合久久精品| 久久精品av麻豆的观看方式| a在线欧美一区| 欧美精品丝袜中出| 国产网站一区二区三区| 一区二区三区欧美在线观看| 日本美女一区二区三区视频| 成人精品小蝌蚪| 欧美理论在线播放| 亚洲国产精品99久久久久久久久 | 欧美美女一区二区三区| 日韩精品一区二区三区中文精品 | 亚洲高清在线视频| 国产伦精一区二区三区| 色婷婷久久久亚洲一区二区三区| 91精品国产aⅴ一区二区| 欧美激情综合五月色丁香小说| 亚洲成人7777| 成人性生交大片| 欧美裸体bbwbbwbbw| 国产精品进线69影院| 免费看欧美美女黄的网站| 91色乱码一区二区三区| 欧美精品一区二区三区一线天视频| 亚洲品质自拍视频| 国产在线视频不卡二| 精品视频1区2区3区| 国产精品三级视频| 精品在线观看视频| 欧美日韩精品欧美日韩精品| 中文字幕av在线一区二区三区| 天堂蜜桃91精品| 91视频一区二区| 国产欧美日韩亚州综合| 日韩成人免费电影| 欧美综合欧美视频| 亚洲三级在线观看| 国产超碰在线一区| 精品对白一区国产伦| 午夜精品免费在线观看| 91麻豆swag| 国产精品嫩草影院av蜜臀| 国产在线精品免费av| 91精品国产综合久久香蕉麻豆| 亚洲免费看黄网站| 99精品视频一区二区三区| 久久九九全国免费| 精品一区二区三区不卡| 欧美一三区三区四区免费在线看| 亚洲永久精品国产| 91麻豆福利精品推荐| 亚洲视频在线一区二区| 不卡av电影在线播放| 国产精品久久久久影院老司| 国产福利91精品一区二区三区| 欧美精品一区二区三区高清aⅴ| 日本vs亚洲vs韩国一区三区| 欧美夫妻性生活| 日本不卡高清视频| 日韩一区二区免费高清| 乱中年女人伦av一区二区| 91精品国产麻豆| 久久99蜜桃精品| 亚洲精品一区二区在线观看| 国产一区三区三区| 国产午夜亚洲精品不卡| 成人午夜电影小说| 亚洲欧洲无码一区二区三区| 在线观看av不卡| 亚洲国产欧美在线人成| 欧美日韩你懂得| 青娱乐精品视频| 精品国产欧美一区二区| 国产电影一区在线| 中文字幕在线观看一区二区| 91亚洲国产成人精品一区二区三| 国产精品乱码久久久久久| 91麻豆精东视频| 天天色综合成人网| 精品国产露脸精彩对白 | 91麻豆精品国产91久久久久久久久 | 日韩亚洲欧美一区| 免费欧美日韩国产三级电影| 欧美大片一区二区| 国产91富婆露脸刺激对白| 日韩毛片精品高清免费| 欧美性淫爽ww久久久久无| 午夜视频在线观看一区二区| 欧美成人a∨高清免费观看| 国产成人精品影视| 亚洲人成在线观看一区二区| 欧美精品丝袜中出| 高清不卡一区二区| 亚洲自拍欧美精品| 精品国产伦一区二区三区观看体验 | 国产成人精品免费网站| 亚洲乱码精品一二三四区日韩在线| 欧美午夜电影一区| 九色porny丨国产精品| 中文字幕日本乱码精品影院| 欧美色图第一页| 国产精品一区二区在线观看不卡| 亚洲女厕所小便bbb| 91麻豆精品国产91久久久| 国产91综合一区在线观看| 亚洲综合久久av| 亚洲精品一区二区三区蜜桃下载 | 91美女精品福利| 免费欧美日韩国产三级电影| 日韩一区在线免费观看| 欧美丰满少妇xxxxx高潮对白| 国产不卡视频一区二区三区| 午夜精品在线看| 国产精品久久久久久久裸模| 欧美一区二区精美| 99re亚洲国产精品| 久久精品国产亚洲5555| 亚洲激情一二三区| xf在线a精品一区二区视频网站| 一本色道久久综合亚洲91| 久久66热re国产| 亚洲成人综合网站| 中文字幕一区二区三区乱码在线| 国产欧美精品一区二区三区四区| 欧美日韩免费在线视频| jizz一区二区| 经典一区二区三区| 亚洲电影一区二区|