日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

再探泛型 API,感受 Python 對象的設計哲學

來源: 責編: 時間:2024-05-27 08:53:35 213觀看
導讀之前我們提到了泛型 API,這類 API 的特點是可以處理任意類型的對象,舉個例子。// 返回對象的長度PyObject_Size// 返回對象的某個屬性PyObject_GetAttr// 返回對象的哈希值PyObject_Hash// 將對象轉成字符串返回PyObjec

之前我們提到了泛型 API,這類 API 的特點是可以處理任意類型的對象,舉個例子。ITr28資訊網——每日最新資訊28at.com

// 返回對象的長度PyObject_Size// 返回對象的某個屬性PyObject_GetAttr// 返回對象的哈希值PyObject_Hash// 將對象轉成字符串返回PyObject_Str

對應到 Python 代碼中,就是下面這個樣子。ITr28資訊網——每日最新資訊28at.com

# PyObject_Sizeprint(len("古明地覺"))print(len([1, 2, 3]))"""43"""# PyObject_GetAttrprint(getattr("古明地覺", "lower"))print(getattr([1, 2, 3], "append"))print(getattr({}, "update"))"""<built-in method lower of str object at 0x7f081aa7e920><built-in method append of list object at 0x7f081adc1100><built-in method update of dict object at 0x7f081aa8fd80>"""# PyObject_Hashprint(hash("古明地覺"))print(hash(2.71))print(hash(123))"""81525063933782332031637148536541722626123"""# PyObject_Strprint(str("古明地覺"))print(str(object()))"""古明地覺<object object at 0x7fdfa0209d10>"""

這些 API 能處理任意類型的對象,這究竟是怎么辦到的?要想搞清楚這一點,還是要從 PyObject 入手。ITr28資訊網——每日最新資訊28at.com

我們知道對象在 C 看來就是一個結構體實例,并且結構體嵌套了 PyObject。ITr28資訊網——每日最新資訊28at.com

# 創建一個列表,讓變量 var 指向它var = [1, 2, 3]# 創建一個浮點數,讓變量 var 指向它var = 2.71

列表對應的結構體是 PyListObject,浮點數對應的結構體是 PyFloatObject,變量 var 是指向對象的指針。那么問題來了,憑啥一個變量可以指向不同類型的對象呢?或者說變量和容器里面為什么可以保存不同對象的指針呢?ITr28資訊網——每日最新資訊28at.com

原因在前面的文章中解釋的很詳細了,因為對象的指針會統一轉成 PyObject * 之后再交給變量保存,以創建列表為例。ITr28資訊網——每日最新資訊28at.com

圖片圖片ITr28資訊網——每日最新資訊28at.com

當然創建浮點數也是同理,因此變量和容器里的元素本質上就是一個泛型指針 PyObject *。而對象的指針在交給變量保存的時候,也都會先轉成 PyObject *,因為不管什么對象,它底層的結構體都嵌套了 PyObject。正是因為這個設計,變量才能指向任意的對象。ITr28資訊網——每日最新資訊28at.com

圖片圖片ITr28資訊網——每日最新資訊28at.com

所以 Python 變量相當于一個便利貼,可以貼在任意對象上。ITr28資訊網——每日最新資訊28at.com

不過問題來了,由于對象的指針會統一轉成 PyObject * 之后再交給變量保存,那么變量怎么知道自己指向的是哪種類型的對象呢?相信你肯定知道答案:通過 ob_type 字段。ITr28資訊網——每日最新資訊28at.com

圖片圖片ITr28資訊網——每日最新資訊28at.com

對象對應的結構體可以有很多個字段,比如 PyListObject,但變量能看到的只有前兩個字段。至于之后的字段是什么,則取決于對象的類型,總之對變量來說是不可見的,因為它是 PyObject *。ITr28資訊網——每日最新資訊28at.com

所以變量會先通過 ob_type 字段獲取對象的類型,如果 ob_type 字段的值為 &PyList_Type,那么變量指向的就是 PyListObject。如果 ob_type 字段的值為 &PyFloat_Type,那么變量指向的就是 PyFloatObject,其它類型同理。ITr28資訊網——每日最新資訊28at.com

當得到了對象的類型,那么再轉成相應的指針即可,假設 ob_type 是 &PyList_Type,那么變量會再轉成 PyListObject *,這樣就可以操作列表的其它字段了。ITr28資訊網——每日最新資訊28at.com

所以我們再總結一下:ITr28資訊網——每日最新資訊28at.com

圖片圖片ITr28資訊網——每日最新資訊28at.com

變量和容器里的元素只能保存相同的指針類型,而不同類型的對象,其底層的結構體是不同的。但這些結構體無一例外都嵌套了 PyObject,因此它們的指針會統一轉成 PyObject * 之后再交給變量保存。ITr28資訊網——每日最新資訊28at.com

然后變量在操作對象時,會先通過 ob_type 判斷對象的類型,假如是 &PyList_Type,那么會再轉成 PyListObject *,其它類型同理。ITr28資訊網——每日最新資訊28at.com

圖片圖片ITr28資訊網——每日最新資訊28at.com

相信你已經知道為什么泛型 API 可以處理任意類型的對象了,以 PyObject_GetAttr 為例,它內部會調用類型對象的 tp_getattro。ITr28資訊網——每日最新資訊28at.com

// 等價于 getattr(v, name)PyObject *PyObject_GetAttr(PyObject *v, PyObject *name){       // 獲取對象 v 的類型對象    PyTypeObject *tp = Py_TYPE(v);    PyObject* result = NULL;    // 如果類型對象實現了 tp_getattro,那么進行調用    // 等價于 Python 中的 type(v).__getattr__(v, name)    if (tp->tp_getattro != NULL) {        result = (*tp->tp_getattro)(v, name);    }    // 否則會退化為 tp_getattr,它要求屬性名稱必須是 C 字符串    // 不過 tp_getattr 已經廢棄,應該使用 tp_getattro    else if (tp->tp_getattr != NULL) {        const char *name_str = PyUnicode_AsUTF8(name);        if (name_str == NULL) {            return NULL;        }        result = (*tp->tp_getattr)(v, (char *)name_str);    }    // 否則說明對象 v 沒有指定屬性    else {        PyErr_Format(PyExc_AttributeError,                    "'%.100s' object has no attribute '%U'",                    tp->tp_name, name);    }    return result;}

函數先通過 ob_type 找到對象的類型,然后通過類型對象的 tp_getattro 調用對應的屬性查找函數。所以 PyObject_GetAttr 會根據對象的類型,調用不同的屬性查找函數,因此這就是泛型 API 能處理任意對象的秘密。ITr28資訊網——每日最新資訊28at.com

我們再以 Python 為例:ITr28資訊網——每日最新資訊28at.com

class A:    def __getattr__(self, item):        return f"class:A,item:{item}"class B:    def __getattr__(self, item):        return f"class:B,item:{item}"a = A()b = B()print(getattr(a, "some_attr"))print(getattr(b, "some_attr"))"""class:A,item:some_attrclass:B,item:some_attr"""# 以上等價于print(type(a).__getattr__(a, "some_attr"))print(type(b).__getattr__(b, "some_attr"))"""class:A,item:some_attrclass:B,item:some_attr"""

在 Python 里的表現和源碼是一致的,我們再舉個 iter 的例子:ITr28資訊網——每日最新資訊28at.com

data = [1, 2, 3]print(iter(data))print(type(data).__iter__(data))"""<list_iterator object at 0x7fb8200f29a0><list_iterator object at 0x7fb8200f29a0>"""

如果一個對象支持迭代器操作,那么它的類型對象一定實現了 __iter__,通過 type(data) 可以獲取到類型對象,然后將 data 作為參數調用 __iter__ 即可。ITr28資訊網——每日最新資訊28at.com

所以通過 ob_type 字段,這些泛型 API 實現了類似多態的效果,一個函數,多種實現。ITr28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-90852-0.html再探泛型 API,感受 Python 對象的設計哲學

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Vue3 新玩法!我能操控計算屬性 Computed!

下一篇: Python 類型注解與檢查:讓代碼“開口說話”的八個妙招

標簽:
  • 熱門焦點
  • iPhone賣不動了!蘋果股價創年內最大日跌幅:市值一夜蒸發萬億元

    8月5日消息,今天凌晨美股三大指數高開低走集體收跌,道指跌0.41%;納指跌0.36%;標普500指數跌0.52%。熱門科技股也都變化極大,其中蘋果報181.99美元,跌4.8%,創
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 支持aptX Lossless無損傳輸 iQOO TWS 1賽道版發布限時優惠價369元

    2023年7月4日,“無損音質,聲動人心”iQOO TWS 1正式發布,支持aptX Lossless無損傳輸,限時優惠價369元。iQOO TWS 1耳機率先支持端到端aptX Lossless無
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国内精品国语自产拍在线观看| 欧美日韩成人网| 亚洲色诱最新| 宅男噜噜噜66一区二区66| 亚洲一区二区在线观看视频| 午夜精品免费在线| 久久久国产精品一区| 蜜臀av一级做a爰片久久| 欧美黑人国产人伦爽爽爽| 欧美婷婷久久| 国产一区二区三区黄| 亚洲国产精品va| 亚洲视频免费看| 欧美主播一区二区三区| 免费在线视频一区| 欧美日韩一区在线播放| 国产日韩免费| 91久久精品国产91久久性色tv| 在线中文字幕一区| 久久久国产午夜精品| 欧美激情一区二区三区在线视频| 国产精品美女诱惑| 亚洲国产成人久久综合| 亚洲制服欧美中文字幕中文字幕| 久久久久久一区二区三区| 欧美日韩国产综合在线| 国产一区二区三区四区在线观看| 亚洲国产一区在线观看| 亚洲欧美日本伦理| 免费精品99久久国产综合精品| 欧美午夜视频在线| 亚洲成人在线观看视频| 亚洲伊人一本大道中文字幕| 免费精品视频| 久久高清免费观看| 午夜视黄欧洲亚洲| 欧美日韩999| 国产乱码精品一区二区三区不卡| 国产一区二区三区在线免费观看| 亚洲美女在线一区| 欧美先锋影音| 中文精品视频| 欧美巨乳波霸| 国产欧美精品国产国产专区| 亚洲精品免费在线| 国产精品爱啪在线线免费观看| 亚洲美女精品久久| 一区二区亚洲精品国产| 国产亚洲午夜| 亚洲高清视频在线| 欧美精品久久天天躁| 在线观看日韩av电影| 亚洲影院高清在线| 欧美色另类天堂2015| 久久久久久69| 亚洲另类视频| 国产精品亚洲网站| 欧美 日韩 国产在线 | 亚洲日本成人在线观看| 欧美午夜精品理论片a级大开眼界| 男人的天堂亚洲| 亚洲欧美一区二区原创| 亚洲人成网站在线观看播放| 免费看黄裸体一级大秀欧美| 一本色道久久综合| 国产精品色婷婷| 欧美女同视频| 欧美区在线播放| 欧美日韩高清在线观看| 国产精品国内视频| 国产精品s色| 欧美久久久久久久| 国产精品青草久久久久福利99| 国产欧美日韩伦理| 一区二区三区欧美激情| 欧美黄色精品| 亚洲国产欧美一区二区三区久久| 久久久久99| 国产亚洲一区在线| 香蕉免费一区二区三区在线观看| 欧美新色视频| 中日韩男男gay无套| 欧美日韩国产高清| 99国产精品国产精品毛片| 欧美日韩成人一区二区| 日韩亚洲不卡在线| 欧美日韩精品系列| 一区二区三区精品| 欧美视频精品一区| 亚洲手机成人高清视频| 国产精品国产自产拍高清av王其 | 国产欧美一区二区精品仙草咪 | avtt综合网| 欧美日韩一区二| 一本久久综合| 国产精品va在线| 亚洲欧美在线另类| 国产亚洲高清视频| 久久裸体艺术| 亚洲国产欧美另类丝袜| 欧美精品激情| 一级成人国产| 国产精品久久久久婷婷| 欧美亚洲三区| 黄色成人免费网站| 免费亚洲一区| 99在线精品免费视频九九视| 国产精品扒开腿爽爽爽视频| 亚洲欧美一区二区激情| 国产视频一区三区| 久热国产精品视频| 亚洲精品综合精品自拍| 欧美视频在线免费看| 亚洲欧美综合网| 激情成人中文字幕| 欧美久久视频| 先锋影音一区二区三区| 黑人中文字幕一区二区三区| 女人色偷偷aa久久天堂| 99热免费精品| 国产视频精品免费播放| 麻豆精品视频在线观看| 99国产精品久久久久老师| 国产精品久久久久久久久| 久久久www成人免费毛片麻豆| 亚洲欧洲精品一区二区三区不卡| 欧美性大战久久久久久久| 久久精品久久99精品久久| 最新精品在线| 国产精品亚洲第一区在线暖暖韩国| 久久精品视频导航| 日韩亚洲在线观看| 国产一区91| 欧美日本精品一区二区三区| 先锋影音网一区二区| 亚洲人成在线观看| 国产精品永久免费观看| 免费观看30秒视频久久| 亚洲综合国产精品| 在线观看日韩国产| 国产精品户外野外| 毛片一区二区| 亚洲免费中文| 亚洲国产日日夜夜| 国产精自产拍久久久久久| 欧美成年人视频网站| 亚洲欧美日韩综合| 亚洲区一区二区三区| 国产美女精品视频免费观看| 欧美华人在线视频| 欧美在线一二三区| aa国产精品| 亚洲第一天堂av| 国产精品一区一区| 欧美日韩的一区二区| 久久久久久一区| 先锋影音网一区二区| 亚洲美女网站| 原创国产精品91| 国产欧美日韩激情| 欧美日本三级| 老司机午夜精品视频| 午夜精品久久久久久久久久久久| 91久久久一线二线三线品牌| 国产色爱av资源综合区| 欧美午夜视频在线| 欧美成人综合一区| 久久久久久久久久看片| 亚洲影音一区| 99国产精品私拍| 亚洲高清不卡在线| 国内精品久久久久久久影视麻豆| 欧美色综合天天久久综合精品| 免费视频一区二区三区在线观看| 欧美一级欧美一级在线播放| 一区二区免费在线播放| 亚洲国产视频一区| 激情成人亚洲| 国产一区二区三区四区在线观看| 国产精品扒开腿做爽爽爽软件| 欧美久久一区| 欧美高清一区二区| 久久网站热最新地址| 欧美一区国产二区| 亚洲女同同性videoxma| 一区二区91| 一区二区三区产品免费精品久久75 | 一区二区日韩| 亚洲高清在线观看一区| 国语自产精品视频在线看| 国产欧美日韩免费| 国产精品日韩精品欧美精品| 欧美日韩在线播放一区| 欧美黄色免费| 欧美激情视频一区二区三区在线播放 | 国产欧美日韩伦理| 国产精品久久久久久久久搜平片 | 久久九九热免费视频| 欧美在线关看| 久久www成人_看片免费不卡| 欧美亚洲自偷自偷| 欧美一级大片在线观看| 欧美一区二区三区免费在线看 | 午夜精品福利视频|