成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 詳解Python描述符的工作原理

詳解Python描述符的工作原理

熱門標簽:ai電銷機器人的優(yōu)勢 南陽打電話機器人 聊城語音外呼系統(tǒng) 商家地圖標注海報 地圖標注自己和別人標注區(qū)別 海外網吧地圖標注注冊 孝感營銷電話機器人效果怎么樣 打電話機器人營銷 騰訊地圖標注沒法顯示

一、前言

其實,在開發(fā)過程中,雖然我們沒有直接使用到描述符,但是它在底層卻無時不刻地被使用到,例如以下這些:

functionbound method、unbound method

裝飾器propertystaticmethod、classmethod

是不是都很熟悉?

這些都與描述符有著千絲萬縷的關系,這篇文章我們就來看一下描述符背后的工作原理。

二、什么是描述符?

在解釋什么是「描述符」之前,我們先來看一個簡單的例子。

這個例子非常簡單,我們在類 A 中定義了一個類屬性 x,然后打印它的值。

其實,除了直接定類屬性之外,我們還可以這樣定義一個類屬性:

仔細看,這次類屬性 x 不再是一個具體的值,而是一個類 TenTen 中定義了一個 __get__ 方法,返回具體的值。

在 Python 中,允許把一個類屬性,托管給一個類,這個屬性就是一個「描述符」。

換句話說,「描述符」是一個「綁定行為」的屬性。

怎么理解這句話?

回憶一下,我們開發(fā)時,一般把「行為」叫做什么?是的,「行為」一般指的是一個方法。

所以我們也可以把「描述符」理解為:對象的屬性不再是一個具體的值,而是交給了一個方法去定義。

可以想一下,如果我們用一個方法去定義一個屬性,這么做的好處是什么?

有了方法,我們就可以在方法內實現(xiàn)自己的邏輯,最簡單的,我們可以根據(jù)不同的條件,在方法內給屬性賦予不同的值,就像下面這樣:

三、描述符協(xié)議

了解了描述符的定義,現(xiàn)在我們把重點放到托管屬性的類上。

其實,一個類屬性想要托管給一個類,這個類內部實現(xiàn)的方法不能是隨便定義的,它必須遵守「描述符協(xié)議」,也就是要實現(xiàn)以下幾個方法:

__get__(self, obj, type=None)
__set__(self, obj, value)
__delete__(self, obj)

只要是實現(xiàn)了以上幾個方法的其中一個,那么這個類屬性就可以稱作描述符。

另外,描述符又可以分為「數(shù)據(jù)描述符」和「非數(shù)據(jù)描述符」:

只定義了 __get___,叫做非數(shù)據(jù)描述符
除了定義 __get__ 之外,還定義了 __set__ 或 __delete__,叫做數(shù)據(jù)描述符

它們兩者有什么區(qū)別,我會在下面詳述。

現(xiàn)在我們來看一個包含 __get__ 和 __set__ 方法的描述符例子:

在這例子中,類屬性 age 是一個描述符,它的值取決于 Age 類。

從輸出結果來看,當我們獲取或修改 age 屬性時,調用了 Age 的 __get__ 和 __set__ 方法:

  • 當調用 p1.age 時,__get__ 被調用,參數(shù) obj 是 Person 實例,type 是 type(Person)
  • 當調用 Person.age 時,__get__ 被調用,參數(shù) obj 是 None,type 是 type(Person)
  • 當調用 p1.age = 25時,__set__ 被調用,參數(shù) obj 是 Person 實例,value 是25
  • 當調用 p1.age = -1時,__set__ 沒有通過校驗,拋出 ValueError

其中,調用 __set__ 傳入的參數(shù),我們比較容易理解,但是對于 __get__ 方法,通過類或實例調用,傳入的參數(shù)是不同的,這是為什么?

這就需要我們了解一下描述符的工作原理。

四、描述符的工作原理

要解釋描述符的工作原理,首先我們需要先從屬性的訪問說起。

在開發(fā)時,不知道你有沒有想過這樣一個問題:通常我們寫這樣的代碼 a.b,其背后到底發(fā)生了什么?

這里的 a 和 b 可能存在以下情況:

1.a 可能是一個類,也可能是一個實例,我們這里統(tǒng)稱為對象

2.b 可能是一個屬性,也可能是一個方法,方法其實也可以看做是類的屬性

其實,無論是以上哪種情況,在 Python 中,都有一個統(tǒng)一的調用邏輯:

1.先調用 __getattribute__ 嘗試獲得結果

2.如果沒有結果,調用 __getattr__

用代碼表示就是下面這樣:

我們這里需要重點關注一下 __getattribute__,因為它是所有屬性查找的入口,它內部實現(xiàn)的屬性查找順序是這樣的:

1.要查找的屬性,在類中是否是一個描述符

2.如果是描述符,再檢查它是否是一個數(shù)據(jù)描述符

3.如果是數(shù)據(jù)描述符,則調用數(shù)據(jù)描述符的 __get__

4.如果不是數(shù)據(jù)描述符,則從 __dict__ 中查找

5.如果 __dict__ 中查找不到,再看它是否是一個非數(shù)據(jù)描述符

6.如果是非數(shù)據(jù)描述符,則調用非數(shù)據(jù)描述符的 __get__

7.如果也不是一個非數(shù)據(jù)描述符,則從類屬性中查找

8.如果類中也沒有這個屬性,拋出 AttributeError 異常

寫成代碼就是下面這樣:

如果不好理解,你最好寫一個程序測試一下,觀察各種情況下的屬性的查找順序。

到這里我們可以看到,在一個對象中查找一個屬性,都是先從 __getattribute__ 開始的。

在 __getattribute__ 中,它會檢查這個類屬性是否是一個描述符,如果是一個描述符,那么就會調用它的 __get__ 方法。但具體的調用細節(jié)和傳入的參數(shù)是下面這樣的:

如果 a 是一個實例,調用細節(jié)為:

所以我們就能看到上面例子輸出的結果。

五、數(shù)據(jù)描述符和非數(shù)據(jù)描述符

了解了描述符的工作原理,我們繼續(xù)來看數(shù)據(jù)描述符和非數(shù)據(jù)描述符的區(qū)別。

從定義上來看,它們的區(qū)別是:

  • 只定義了 __get___,叫做非數(shù)據(jù)描述符
  • 除了定義 __get__ 之外,還定義了 __set__ 或 __delete__,叫做數(shù)據(jù)描述符

此外,我們從上面描述符調用的順序可以看到,在對象中查找屬性時,數(shù)據(jù)描述符要優(yōu)先于非數(shù)據(jù)描述符調用。

在之前的例子中,我們定義了 __get__ 和 __set__,所以那些類屬性都是數(shù)據(jù)描述符。

我們再來看一個非數(shù)據(jù)描述符的例子:

這段代碼,我們定義了一個相同名字的屬性和方法 foo,如果現(xiàn)在執(zhí)行 A().foo,你覺得會輸出什么結果?

答案是 abc

為什么打印的是實例屬性 foo 的值,而不是方法 foo 呢?

這就和非數(shù)據(jù)描述符有關系了。

我們執(zhí)行 dir(A.foo),觀察結果:

看到了嗎?A 的 foo 方法其實實現(xiàn)了 __get__,我們在上面的分析已經得知:只定義 __get__ 方法的對象,它其實是一個非數(shù)據(jù)描述符,也就是說,我們在類中定義的方法,其實本身就是一個非數(shù)據(jù)描述符。

所以,在一個類中,如果存在相同名字的屬性和方法,按照上面所講的 __getattribute__ 中查找屬性的順序,這個屬性就會優(yōu)先從實例中獲取,如果實例中不存在,才會從非數(shù)據(jù)描述符中獲取,所以在這里優(yōu)先查找的是實例屬性 foo 的值。

到這里我們可以總結一下關于描述符的相關知識點:

  • 描述符必須是一個類屬性
  • __getattribute__ 是查找一個屬性(方法)的入口
  • __getattribute__ 定義了一個屬性(方法)的查找順序:數(shù)據(jù)描述符、實例屬性、非數(shù)據(jù)描述符、類屬性
  • 如果我們重寫了 __getattribute__ 方法,會阻止描述符的調用
  • 所有方法其實都是一個非數(shù)據(jù)描述符,因為它定義了 __get__

六、描述符的使用場景

了解了描述符的工作原理,那描述符一般用在哪些業(yè)務場景中呢?

在這里我用描述符實現(xiàn)了一個屬性校驗器,你可以參考這個例子,在類似的場景中去使用它。

首先我們定義一個校驗基類 Validator,在 __set__ 方法中先調用 validate 方法校驗屬性是否符合要求,然后再對屬性進行賦值。

現(xiàn)在,當我們對 Person 實例進行初始化時,就可以校驗這些屬性是否符合預定義的規(guī)則了。

七、function與method

我們再來看一下,在開發(fā)時經??吹降?nbsp;functionunbound methodbound method 它們之間到底有什么區(qū)別?

來看下面這段代碼:

從結果我們可以看出它們的區(qū)別:

  • function 準確來說就是一個函數(shù),并且它實現(xiàn)了 __get__ 方法,因此每一個 function 都是一個非數(shù)據(jù)描述符,而在類中會把 function 放到 __dict__ 中存儲
  • 當 function 被實例調用時,它是一個 bound method
  • 當 function 被類調用時, 它是一個 unbound method

function 是一個非數(shù)據(jù)描述符,我們之前已經講到了。

而 bound method 和 unbound method 的區(qū)別就在于調用方的類型是什么,如果是一個實例,那么這個 function 就是一個 bound method,否則它是一個 unbound method

八、property/staticmethod/classmethod

我們再來看 propertystaticmethod、classmethod

這些裝飾器的實現(xiàn),默認是 C 來實現(xiàn)的。

其實,我們也可以直接利用 Python 描述符的特性來實現(xiàn)這些裝飾器,

property 的 Python 版實現(xiàn):

除此之外,你還可以實現(xiàn)其他功能強大的裝飾器。

由此可見,通過描述符我們可以實現(xiàn)強大而靈活的屬性管理功能,對于一些要求屬性控制比較復雜的場景,我們可以選擇用描述符來實現(xiàn)。

到此這篇關于詳解Python描述符的工作原理的文章就介紹到這了,更多相關Python描述符內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python基礎詳解之描述符
  • Python描述符descriptor使用原理解析
  • python實現(xiàn)裝飾器、描述符
  • 詳解Python中的Descriptor描述符類
  • Python黑魔法Descriptor描述符的實例解析
  • Python 的描述符 descriptor詳解
  • 解密Python中的描述符(descriptor)

標簽:楊凌 聊城 揚州 六盤水 迪慶 南寧 牡丹江 撫州

巨人網絡通訊聲明:本文標題《詳解Python描述符的工作原理》,本文關鍵詞  詳解,Python,描述,符,的,工作,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Python描述符的工作原理》相關的同類信息!
  • 本頁收集關于詳解Python描述符的工作原理的相關信息資訊供網民參考!
  • 推薦文章
    激情小说网站亚洲综合网| 国产福利一区二区在线精品| 无码精品人妻一区二区| 国产精品一区二区三区四区在线观看| 男人的天堂在线视频| 国产一区二区三区毛片| 欧美黑人狂野猛交老妇| 看成年女人免费午夜视频| 在线日韩影院| 亚欧色一区w666天堂| 日韩一区二区三区中文字幕| 美女又黄又免费的视频| 亚洲人体视频| 久久午夜夜伦鲁鲁一区二区| 欧美日韩国产成人在线观看| 国产主播在线看| 日韩美女视频一区二区在线观看| 中文字幕在线播放第一页| 亚洲一区二区三区免费看| 国产精品国产三级国产传播| 动漫视频在线一区| 另类春色校园亚洲| 日韩精品人妻中文字幕有码| 欧美天天综合| 欧美精品一线| 福利欧美精品在线| 性欧美video另类hd3| 中文字幕亚洲综合久久筱田步美| 少妇人妻无码专区视频| 午夜午夜精品一区二区三区文| 日韩欧美一区中文| 久热精品视频在线免费观看| 麻豆专区一区二区三区四区五区| 亚洲日本精品国产第一区| 国产乱理伦片a级在线观看| 精品国产网站在线观看| 国产在线视频网站| 国产av人人夜夜澡人人爽| 18涩涩午夜精品.www| 中韩乱幕日产无线码一区| 91精品国产91久久久久麻豆 主演| 国产性生活免费视频| 超碰精品一区二区三区乱码| 久久人人97超碰com| 色综合视频一区二区三区日韩| 偷拍亚洲欧洲综合| 亚洲自拍偷拍综合| 欧美巨大丰满猛性社交| 久久精品天堂| 久久久久88色偷偷免费| 一区二区三区在线观看动漫| 无码人妻精品一区二区蜜桃百度| h视频在线网站| 2025国产精品视频| 成年网站在线免费观看| 亚洲一区电影在线观看| 国产激情视频在线| 久久99亚洲网美利坚合众国| 麻豆一区二区在线观看| 91亚洲国产成人久久精品网站| 亚洲欧洲日产国码av系列天堂| 在线视频中文字幕久| 欧美做暖暖视频| 免费污污视频在线观看| 高清不卡一区二区| 国产在视频一区二区三区吞精| 亚洲成人免费在线观看| www91在线观看| 天天色天天草天天射| 91精品国产色综合久久不卡电影| 国产一区在线观看视频| 日韩av在线播放网址| 久久人人爽人人爽人人片av免费| 黑粗硬长欧美在线视频免费的| 中文字幕国产精品| 北条麻妃高清一区| 午夜电影久久久| 一区二区三区欧美激情| 今天免费高清在线观看国语| 四季av中文字幕| 视频精品一区| 久久久久久久久91| 天天射天天干天天| 91精品国产自产观看在线| 亚洲人成电影在在线观看网色| 男人午夜影院| 欧美日韩电影在线观看| 亚洲图片中文字幕| 免费在线观看的av网站| 欧美乱妇20p| 日韩欧美在线中文字幕| 色婷婷精品大视频在线蜜桃视频| 91精品网站| 91精东传媒理伦片在线观看| 国产精品青青在线观看爽香蕉| 国产66精品久久久久999小说| 国产精一品亚洲二区在线视频| 亚洲国产天堂久久综合网| 综合久久一区二区三区| 国产精品国内免费一区二区三区| 黄色污在线观看| 久久人人九九| 亚洲综合爱爱久久网| 国产精品久久二区二区| 国产精品爽爽爽| 日本特黄在线观看| 日韩av影片| 国产精品一区二区入口九绯色| 亚洲一区二区不卡视频| 欧美久久久久久久久久久久久| 在线精品一区二区三区| 欧美性猛交xxxx免费看| 成人精品免费视频| 欧美亚洲免费| 香蕉av福利精品导航| www.91在线播放| 老牛嫩草一区二区三区日本| 欧美成人久久久免费播放| 久久365资源| 91导航在线观看| 欧美熟乱15p| 成人小视频在线观看| 一级毛片在线看| 男人的天堂在线播放| 亚洲一区免费| 另类小说第一页| 亚洲一区二区精品在线观看| 无码精品一区二区三区在线播放| 欧美色图色就是色| 97婷婷大伊香蕉精品视频| 国产激情片在线观看| 欧美不卡激情三级在线观看| 精品一区二区在线观看视频| juliaann成人作品在线看| 亚洲一区三区电影在线观看| 黄色一区二区视频| 91桃色在线| 成人性生交视频免费观看| 特一级黄色片| 国产理论视频在线观看| 国产在线精品播放| 国产精品久久久久9999小说| 波多野结衣天堂| 久草视频免费在线播放| 国产麻豆天美果冻无码视频| 色呦呦在线观看视频| 成人在线播放网站| 亚洲精品久久久久久久久久久久| 女女色综合影院| 精品无码av在线| 国产又粗又猛又黄| yjizz视频| 久久久久无码精品国产| 538国产精品一区二区免费视频| 黑人精品xxx一区一二区| 3d精品h动漫啪啪一区二区| 欧美精品中文字幕亚洲专区| 天堂在线www天堂中文在线| 日本激情视频一区二区三区| 精品91自产拍在线观看一区| aa片在线观看视频在线播放| 在线亚洲自拍| 成人精品在线视频| 国产精品麻豆| 亚洲精品一卡二卡| 岛国av午夜精品| 色婷婷国产精品免| 欧美制服丝袜第一页| 国产精品视频一区国模私拍| 国产精品999在线观看| 丰满少妇又爽又紧又丰满69| 久久久久久影视| 亚洲精品日韩精品| 欧美成人精品高清在线播放| 久久99久久精品欧美| 九七影院97影院理论片免费| 国产在线观看不卡一区二区三区| 91久久精品视频| 成人在线小视频| 一本一道久久综合狠狠老精东影业| 欧美成人精品午夜一区二区| 国产精品入口| 中文一区二区在线观看| 欧美亚洲系列| 日韩激情av在线播放| 欧美日韩国产区| 欧美疯狂性受xxxxx喷水图片| 日日夜夜综合网| 国产又粗又猛又爽又黄的网站| xxxxx性欧美特大| 四虎海外影库www4hu| 外国精品视频在线观看| 亚洲黄色小视频| 日韩精品一区二区三区中文| 国产女教师bbwbbwbbw| sqte在线播放| 国产美女娇喘av呻吟久久| 精品人妻无码一区二区性色| 国产成人亚洲综合a∨婷婷| 久久综合久久鬼色中文字| 亚洲激情中文1区| av成人观看| 日韩欧美国产一区二区| 韩国在线视频一区| 欧美1级片网站| www.成人精品免费网站青椒| 免费精品国产自产拍在| 性色88av老女人视频| 国产又粗又猛又爽又黄的网站| 国产精品国产三级国产aⅴ原创| 亚洲精品欧美一区二区三区| 中文字幕电影在线| 在线观看视频在线观看| 日本黄色大片视频| 99国产精品久久久| 在线中文字幕第一区| 国产精品男女猛烈高潮激情| 色综合久久网| 中文字幕在线观看的网站| 亚洲一二三级电影| 手机在线观看av网站| 欧美一级生活片| 亚洲精品一级片| 91精品国产高清| 国产欧美日韩麻豆91| 欧美日韩国产免费一区二区三区| 久久九九久久九九| 亚洲国产成人一区| 亚洲人成五月天| 日本欧洲一区| 日本中文字幕二区| 蜜桃在线视频| 国产精品视频一区二区三区麻豆| 极品尤物一区| 精品人妻一区二区三区日产乱码卜| 欧美激情视频免费观看| 日本在线一区| 国产精品毛片一区视频播| 内射毛片内射国产夫妻| av手机在线看| 最近免费中文字幕大全免费第三页| 国产在线视频一区二区三区| 国产成人自拍高清视频在线免费播放| 在线免费日韩| 国产精品亚洲综合一区在线观看| 久久精品精品电影网| 国产在线视视频有精品| 国产后进白嫩翘臀在线观看视频| 国产精彩视频在线| 免费在线黄色网| 日韩 欧美 精品| 蜜桃av导航| 美女一区二区三区视频| 国产精品入口麻豆电影| av在线免费不卡| 九九热在线观看| 日韩午夜在线观看| 国产精品综合色区在线观看| 99国产精品一区二区三区| 亚洲成a人v欧美综合天堂下载| 国产精品外国| 日韩网站在线| 97aⅴ精品视频一二三区| 凹凸av导航大全精品| 中文字幕亚洲精品在线观看| 亚洲va韩国va欧美va精四季| 久久久久国产精品午夜一区| 免费看又黄又无码的网站| 青青草国产一区二区三区| 成人情趣视频| 九色在线网站| 欧美中文一区| 国产视频一二三区| 91精品午夜视频| 国产精品少妇在线视频| 国产高潮国产高潮久久久91| 欧美极品第一页| av女在线播放| 欧美亚洲精品在线| 日本大臀精品| 999精品视频一区二区三区| 91网免费观看| 日本一区二区在线免费播放| 欧美猛男做受videos| 水蜜桃一区二区| 亚洲欧美一区二区不卡| www.操操操| 美女露胸视频在线观看| 开心婷婷激情五月| 岛国一区二区在线观看| 日本另类视频| 91精品国产综合久久久久久丝袜| 国产亚洲精品久久久久久青梅| 午夜影院免费在线| 日韩免费特黄一二三区| 久久视频在线直播| 日韩av中文字幕一区二区三区| 国产成人精品免费视频| 成人亚洲欧美激情在线电影| 国内精品模特av私拍在线观看| 91精品国产91久久久久青草| 中文字幕日韩一区二区三区不卡| 欧美激情中文字幕乱码免费| 国产精品伊人| 欧美性潮喷xxxxx免费视频看| 爱爱免费视频网站| 护士精品一区二区三区| 国产福利在线| 欧美日韩国产影院| 国产精品美女久久久免费| 国产成人羞羞电影网站在线观看| 日本女优在线视频一区二区| 波多野结衣视频一区二区| 日韩精品一区二区三区av| 久久天堂av| 亚洲综合中文| 国产黄色片在线观看| 日韩欧美亚洲国产一区| 99热这里只有精品7| 精品一区二区三区免费爱| 国产高清视频免费观看| 国产男女猛烈无遮挡a片漫画| 18av在线播放| 欧美日韩在线精品一区二区三区| 青青草综合视频| 日本高清在线观看视频| 成人亚洲欧美激情在线电影| 麻豆成人在线看|