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

主頁 > 知識庫 > python源碼剖析之PyObject詳解

python源碼剖析之PyObject詳解

熱門標簽:武漢外呼系統(tǒng)平臺 沈陽防封電銷卡品牌 池州外呼調研線路 如何申請400電話費用 沈陽外呼系統(tǒng)呼叫系統(tǒng) 外呼系統(tǒng)哪些好辦 沈陽人工外呼系統(tǒng)價格 江西省地圖標注 富錦商家地圖標注

一、Python中的對象

Python中一切皆是對象。
————Guido van Rossum(1989)

這句話只要你學過python,你就很有可能在你的Python學習之旅的前30分鐘就已經(jīng)見過了,但是這句話具體是什么意思呢?

一句話來說,就是面向對象中的“類”和“對象”在Python中都是對象。類似于int對象的類型對象,實現(xiàn)了“類的概念”,對類型對象“實例化”得到的實例對象實現(xiàn)了“對象”這個概念。

通常的說法是,對象是數(shù)據(jù)以及基于這些數(shù)據(jù)的操作的集合。在計算機上,一個對象實際上就是一片被分配的內存空間,這些內存可能是連續(xù)的,也有可能是離散的,這都不重要,重要的是這片內存在更高的層次上可以作為一個整體來考慮,這個整體就是一個對象。在這片內存中,存儲著一系列的數(shù)據(jù)以及可以對這些數(shù)據(jù)進行修改或讀取的一系列操作的代碼。

在 Python 中,對象就是在堆上申請的結構體,對象不能是被靜態(tài)初始化的,并且也不能是在棧空間上生存的。唯一的例外就是類型對象(type object),Python中所有的類型對象都是被靜態(tài)初始化的。在 Python 中,一個對象一旦被創(chuàng)建,它在內存中的大小就是不變的了。 這就意味著那些需要容納可變長度數(shù)據(jù)的對象只能在對象內維護一個指向一個可變大小的內存區(qū)域的指針。

1.1 對象機制的基石PyObject

PyObjectPyVarObject分別表示定長對象和變長對象,使用的C的struct實現(xiàn)的,在結構中分別只定義了 PyObject_HEADPyObject_VAR_HEAD,后者僅僅是前者加上一個表示容納元素個數(shù)的ob_size

[object.h]
/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD \

	_PyObject_HEAD_EXTRA \

	int ob_refcnt; \

	struct _typeobject *ob_type;

#define PyObject_VAR_HEAD \

	PyObject_HEAD \

	int ob_size; /* Number of items in variable part */

而對于兩者共有的PyObject_HEAD中,只有兩個東西,一個是維護引用計數(shù)的ob_refcnt和一個指向類型對象PyTypeObject結構體的指針。因此, Python 中實際上對象機制的核心非常的簡單,一個是引用計數(shù),一個就是類型。并且Python中每一個對象的開始字節(jié)都是相同的頭部,這使得對Python對象的引用十分統(tǒng)一,只需要一個PyObject*可以引用任意一個對象。

這兩個結構體定義的只是Python中對象共有的部分,其他的具體類型會有額外的結構體來定義,否則的話所有的對象豈不是都一樣了?比如int類型的結構體定義PyIntObject中包含了PyObject_HEADob_ival后者是一個long,存放具體的值。

二、類型對象

那初始化對象的時候,去那里獲得對象的大小呢?只能是在類型對象PyTypeObject中了!類型對象中存放了大量對象的元信息,大小顯然是一種和對象的類型有關的元信息!注意,一個PyObject對象就是Python中對面向對象理論中類這個概念的實現(xiàn),這里面存放了類型名、內存空間、操作函數(shù)指針等信息。

2.1 對象的創(chuàng)建

Python會用兩種方法創(chuàng)建對象,一種是泛型API(AOL:Abstract Object Layer),可以應用在任何Python對象上,API內不會有機制確定最終調用哪個具體函數(shù),比如PyObject_New(PyObject, PyInt_Type)。另一種是類型相關API(COL:Concrete Object Layer),只能應用于具體類型的對象上,比如PyInt_FromLong(10)

自定義對象在Python內部不可能存在COL,所以只能根據(jù)其類型對象來創(chuàng)建實例對象,這就需要PyTypeObject中的tp_new函數(shù)指針,如果是自定義對象,這個指針可能是空,那就通過PyTypeObjecttp_base找到類型對象的基類,再找tp_new指針,這個過程中會利用類型對象中記錄的空間信息申請內存。對于 Python 中的任何一種變長對象,tp_itemsize 這個域是必須設置的,tp_itemsize 指明了由變長對象保存的元素的單位長度,所謂單位長度即是指一個對象在內存中的長度。這個 tp_itemsizeob_size 共同決定了應該額外申請的內存的總大小是多少。

內建對象最終會使用COL完成創(chuàng)建工作。

new函數(shù)完成后,會執(zhí)行init函數(shù),前者類似于new操作符,后者類似于構造函數(shù)。

2.2 對象的行為

像前面說的,對象的行為被類型對象中的函數(shù)指針所定義。這些操作中,有三組非常重要的操作族:tp_as_numbertp_as_sequencetp_as_mapping分別指向PyNumberMethodsPtSequenceMethodsPyMappingMethods函數(shù)族結構體。所謂“鴨子類型”,就行能找到該類型對應的操作,就可以當做這個類型來用。

class MyInt(int):
    def __getitem__(self, key):
        return key+str(self)

a=MyInt(1)
b=MyInt(2)
print(a+b)
print(a['somekey'])

可以發(fā)現(xiàn)通過int繼承得到的數(shù)值對象,通過重寫魔術方法,使其支持了字典類型的操作,其實我們可以認為是,制定了MyInt這個類型對象tp_as_mapping.mp_subscript操作。

2.3 類型的類型

之前說了,作為類的實現(xiàn)的類型對象也是Python對象,那么類型對象PyObjectob_type指針指向哪呢?是指向自己嗎?盡管我一開始也是這么想的,但可惜這個答案不對,類型對象指向的對象是PyType_Type。這個對象在Python類型機制中很重要,所有用戶自定義class的PyTypeObject對象都是通過這個對象創(chuàng)建的,因此他是Python中的元類(metaclass)。他是所有class的class。而元類的類型是自己,這里出現(xiàn)了我們一開始認為會出現(xiàn)的自己只想自己的情況!

i=1
class A:
    pass
a=A()
print(i.__class__) # 類型對象
print(i.__class__.__class__) # 元類
print(a.__class__) # 類型對象
print(a.__class__.__class__) # 元類
print(a.__class__.__class__.__class__) # 指向自己

留在這里的疑問:虛線和虛線指向的對象是啥玩?

三、Python的多態(tài)性

通過 PyObject 和類型對象, Python 利用 C 語言完成了 C++所提供的繼承和多態(tài)的特性。一開始已經(jīng)提到,Python中所有對象的前面幾個字節(jié)都是PyObject類型也就是PyObject_HEAD結構體。因此在 Python 內部各個函數(shù)之間傳遞的都是一種范型指針PyObject*。這個指針所指的對象究竟是什么類型的,不知道,只能從指針所指對象的ob_type域判斷,而正是通過這個域,Python 實現(xiàn)了多態(tài)機制。

真正執(zhí)行的時候,通過找到實例對象指向的類型對象的函數(shù)指針來執(zhí)行方法。這里同一個函數(shù)在不同情況下表現(xiàn)出了不同的行為,這正是多態(tài)的核心所在。

四、引用計數(shù)

在 Python 中,主要是通過Py_INCREF(op)Py_DECREF(op)兩個宏來增加和減少一個對象的引用計數(shù)。當一個對象的引用計數(shù)減少到 0 之后, Py_DECREF將調用該對象的析構函數(shù)(deallocator function)(但是不一定真的釋放該對象所占有的內存和系統(tǒng)資源),即類型對象中tp_dealloc指向的函數(shù)。例外的是類型對象,PyTypeObject是超越引用計數(shù)規(guī)則的,永遠不會被析構,每一個對象中指向類型對象的指針不被視為對類型對象的引用。

這有些觀察者模式(Observer)的影子,在ob_refcnt減為 0 之后,將觸發(fā)對象銷毀的事件;從 Python 的對象體系來看,各個對象又提供了不同的事件處理函數(shù),而事件的注冊動作正是在各個對象對應的類型對象中靜態(tài)完成的。

PyObject中我們看到ob_refcnt是一個 32 位的整形變量,這實際是一個Python所做的假設,即對一個對象的引用不會超過一個整形變量的最大值。

五、Python對象的分類

到此這篇關于python源碼剖析之PyObject詳解的文章就介紹到這了,更多相關python源碼PyObject內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

標簽:通遼 常德 銅川 潛江 株洲 黑龍江 阿里 呂梁

巨人網(wǎng)絡通訊聲明:本文標題《python源碼剖析之PyObject詳解》,本文關鍵詞  python,源碼,剖析,之,PyObject,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python源碼剖析之PyObject詳解》相關的同類信息!
  • 本頁收集關于python源碼剖析之PyObject詳解的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    五月天丁香久久| 欧美一级欧美一级在线播放| 制服丝袜成人动漫| 亚洲国产精品国自产拍av| 亚洲国产精品影院| 色婷婷精品大视频在线蜜桃视频 | 亚洲国产一区视频| 成人教育av在线| 国产日韩欧美精品一区| 国产一区高清在线| 国产人成亚洲第一网站在线播放| 青青草视频一区| 欧美成人一区二区三区片免费 | 韩国av一区二区三区在线观看| 欧美日韩一卡二卡| 日本人妖一区二区| 精品少妇一区二区三区免费观看 | 亚洲国产wwwccc36天堂| 欧美少妇一区二区| 亚洲高清一区二区三区| 在线不卡免费欧美| 国产在线一区观看| 亚洲天堂久久久久久久| 91麻豆精品秘密| 麻豆精品蜜桃视频网站| 国产欧美日韩在线| 色婷婷综合久久久久中文一区二区 | 91蜜桃网址入口| 亚洲综合色噜噜狠狠| 69堂国产成人免费视频| 国产麻豆精品95视频| 一区二区成人在线视频 | 欧美一级二级在线观看| 国产成人精品免费视频网站| 亚洲一区二区三区三| 精品女同一区二区| 欧美在线视频你懂得| 国内成+人亚洲+欧美+综合在线| 亚洲欧美另类图片小说| 日韩女优av电影在线观看| 色婷婷久久久亚洲一区二区三区| 青青青伊人色综合久久| 亚洲精品视频在线| 国产精品网曝门| 91精品国产综合久久福利| 国产乱对白刺激视频不卡| 亚洲视频免费在线观看| 欧美人伦禁忌dvd放荡欲情| 国产精品灌醉下药二区| av电影天堂一区二区在线观看| 午夜精品久久久久影视| 久久久99精品免费观看不卡| 欧美日韩视频第一区| 97精品久久久久中文字幕| 久久精品国产一区二区| 亚洲一区二区三区四区在线观看| 日韩精品一区二区三区蜜臀| 在线精品视频一区二区三四| 亚洲一区二区在线视频| 亚洲欧美另类图片小说| 日韩美女主播在线视频一区二区三区| 国产精品亚洲一区二区三区在线| 日韩一区精品字幕| 亚洲国产精品一区二区www在线| 欧美国产一区二区在线观看| 6080亚洲精品一区二区| 欧美日韩精品免费观看视频| 一本久久精品一区二区| 国产高清不卡一区| 国产成人免费视频网站| 国产精品538一区二区在线| 韩国v欧美v亚洲v日本v| 国产一区亚洲一区| 日韩av二区在线播放| 国内精品免费在线观看| 韩国av一区二区| 麻豆成人91精品二区三区| 极品尤物av久久免费看| 青娱乐精品在线视频| 激情综合色综合久久综合| 捆绑调教美女网站视频一区| 丝袜亚洲另类欧美| 中文字幕乱码亚洲精品一区| 7777精品伊人久久久大香线蕉的| 91视视频在线观看入口直接观看www | 国产清纯在线一区二区www| 中国色在线观看另类| 亚洲人成在线播放网站岛国| 国产精品国产三级国产aⅴ中文 | 日本欧美加勒比视频| 韩国欧美一区二区| 欧美色国产精品| 精品毛片乱码1区2区3区| 国产无遮挡一区二区三区毛片日本| 国产精品视频麻豆| 五月天激情小说综合| 精品一区二区三区日韩| 91丨porny丨蝌蚪视频| 欧美不卡一二三| 亚洲国产三级在线| 国产揄拍国内精品对白| 91麻豆精品国产91久久久久久| 国产亚洲美州欧州综合国| 亚洲二区在线观看| 国产精品综合一区二区| 欧美一区中文字幕| 亚洲成人www| 欧美日韩成人一区| 亚洲国产成人porn| yourporn久久国产精品| 欧美变态口味重另类| 日韩国产欧美视频| 在线观看日韩精品| 欧美α欧美αv大片| 国产在线不卡一卡二卡三卡四卡| 日韩免费一区二区| 久久激情五月婷婷| 久久久久久久免费视频了| 国产成人免费av在线| 欧美日韩一卡二卡三卡 | 国产精品久久久久久一区二区三区 | 国产91高潮流白浆在线麻豆| 久久综合九色综合97婷婷女人| 久久福利视频一区二区| 日韩三级中文字幕| 国产精品99久久久久久久女警| 日韩一级大片在线观看| 日本欧洲一区二区| 26uuu色噜噜精品一区二区| 免费成人结看片| 成人免费在线视频| 蜜臀av性久久久久av蜜臀妖精| 丁香亚洲综合激情啪啪综合| 亚洲国产经典视频| 在线精品亚洲一区二区不卡| 视频一区欧美精品| 精品国产91亚洲一区二区三区婷婷| 国产精选一区二区三区| 亚洲色图20p| 久久婷婷国产综合国色天香 | 国产成人在线看| 性做久久久久久免费观看| 精品久久久久久综合日本欧美| 麻豆国产欧美日韩综合精品二区| 国产精品毛片无遮挡高清| 欧美日韩国产系列| 91在线观看一区二区| 视频一区二区中文字幕| 专区另类欧美日韩| 久久精品水蜜桃av综合天堂| 欧美日韩中文国产| 成人爱爱电影网址| 粉嫩高潮美女一区二区三区| 视频在线观看91| 亚洲精品国产成人久久av盗摄| 久久午夜电影网| 2020国产精品久久精品美国| 777奇米四色成人影色区| 风间由美一区二区av101| 午夜精品福利视频网站| 亚洲制服丝袜一区| 亚洲一区国产视频| 亚洲精品亚洲人成人网| 综合欧美一区二区三区| 欧美国产日韩精品免费观看| 欧美一区二区三区四区视频| 欧美午夜精品免费| 制服丝袜av成人在线看| 欧美影院一区二区三区| 99久久99久久精品免费观看| 国产高清亚洲一区| 丰满亚洲少妇av| 福利电影一区二区三区| 国产福利91精品一区二区三区| 日产国产欧美视频一区精品| 亚洲成av人影院在线观看网| 蜜臀av一区二区在线观看| 免费欧美日韩国产三级电影| 精品一区二区三区的国产在线播放| 毛片一区二区三区| 成人综合在线观看| 成人a免费在线看| 97se亚洲国产综合自在线| 欧美三级电影在线观看| 精品乱人伦一区二区三区| 精品国产欧美一区二区| 日韩一区有码在线| 国产精品一区二区在线观看不卡| 在线观看成人免费视频| 国产日产欧产精品推荐色| 亚洲伊人色欲综合网| 成人动漫视频在线| 久久久国产综合精品女国产盗摄| 丝袜美腿亚洲综合| 97精品国产露脸对白| 亚洲色欲色欲www| 91热门视频在线观看| 国产精品丝袜一区| 成人激情免费电影网址| 国产精品乱码一区二三区小蝌蚪|