您現在的位置是:電腦技術吧?>? 組裝維修 ??>??什么是描述符,描述符??>??正文詳情

什么是描述符,描述符

柔飛瑤2019-11-28 13:21:58 人圍觀
簡介特征描述符本文主要介紹Python中描述符的詳細描述,它屬于Python學習過程中類和對象的基本知識。您可以為您的朋友引用描述符,它是Python語言的一個深刻而重要的部格式描述符是什么

這篇文章主要介紹了Python中的描述符詳解,屬于Python學習過程中類與對象的基本知識,需要的朋友可以參考下描述符(Descriptors)是Python語言中一個深奧但卻重要的一部分。

它們廣泛應用于Python語言的內核,熟練掌握描述符將會為Python程序員的工具箱添加一個額外的技巧。

為了給接下來對描述符的討論做一些鋪墊,我將描述一些程序員可能會在日常編程活動中遇到的場景,然后我將解釋描述符是什么,以及它們如何為這些場景提供優雅的解決方案。

在這篇總結中,我會使用新樣式類來指代Python版本。

1、假設一個程序中,我們需要對一個對象屬性執行嚴格的類型檢查。

然而,Python是一種動態語言,所以并不支持類型檢查,但是這并不妨礙我們實現自己版本,且較為初級的類型檢查。

對象屬性類型檢查的傳統方法可能采用下面的方式:? 1 2 3 4 5 6 7 8 9 def __init__(self, name, age): if isinstance(str, name): self.name = name else: raise TypeError(Must be a string) if isinstance(int, age): self.age = age else: raise TypeError(Must be an int) 上面是執行這種類型檢查的一種方法,但是參數數量增加時它將變得比較繁瑣。

另外,在賦值之前,我們可以創建一個在__init__中調用的type_check(type, val)函數,但是當我們想在其他地方設置屬性值時,該如何簡單地實現這種檢查呢。

我想到的一個快速解決方案是Java中的getters和setters,但是這并不符合Python風格,并且比較麻煩。

2、假設在一個程序中,我們想創建一些在運行時立刻初始化然后變成只讀的屬性。

有人也能想到利用Python中的特殊方法來實現,但這種實現方法仍舊是笨拙和繁瑣的。

3、最后,設想一個程序中,我們希望以某種方式自定義對象屬性的訪問。

例如需要記錄這種屬性的訪問。

同樣的,還是可以想到一個解決方法,即使這種解決方案可能比較笨重并且不可復用。

上述問題因都與屬性引用相關而全部聯系在了一起。

下面,我們將嘗試自定義屬性的訪問方法。

Python描述符針對上面所列的問題,描述符提供了優雅、簡潔、健壯和可重用的解決方案。

簡而言之,一個描述符就是一個對象,該對象代表了一個屬性的值。

這就意味著如果一個賬戶對象有一個屬性name,那么描述符就是另一個能夠用來代表屬性name持有值的對象。

描述符協議中定義了__get__、__set__或__delete__ 這些特殊方法,描述符是實現其中一個或多個方法的對象。

這些方法中每一種方法的簽名如下所示:? 1 2 3 4 5 python descr.get(self,obj,type=None)-value。

descr.__set__(self, obj, value) -- None descr.__delete__(self, obj) -- None 實現__get__方法的對象是非數據描述符,意味著在初始化之后它們只能被讀取。

而同時實現__get__和__set__的對象是數據描述符,意味著這種屬性是可寫的。

為了更好地理解描述符,我們給出針對上述問題基于描述符的解決方法。

使用Python描述符實現對象屬性的類型檢查將是一個非常簡單的任務。

裝飾器實現這種類型檢查的代碼如下所示:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 class TypedProperty(object): def __init__(self, name, type, default=None): self.name = _ name self.type = type self.default = default if default else type() def __get__(self, instance, cls): return getattr(instance, self.name, self.default) def __set__(self,instance,value): if not isinstance(value,self.type): raise TypeError(Must be a %s % self.type) setattr(instance,self.name,value) def __delete__(self,instance): raise AttributeError(Can't delete attribute) class Foo(object): name = TypedProperty(name,str) num = TypedProperty(num,int,42) acct = Foo() acct.name = obi acct.num = 1234 print acct.num 1234 print acct.name obi # trying to assign a string to number fails acct.num = '1234' TypeError: Must be a type 'int' 在這個例子中,我們實現了一個描述符TypedProperty,并且這個描述符類會對它所代表的類的任何屬性執行類型檢查。

注意到這一點很重要,即描述符只能在類級別進行合法定義,而不能在實例級別定義。

例如,在上面例子中的__init__方法里。

當訪問類Foo實例的任何屬性時,描述符會調用它的__get__方法。

需要注意的是,__get__方法的第一個參數是描述符代表的屬性被引用的源對象。

當屬性被分配時,描述符會調用它的__set__方法。

為了理解為什么可以使用描述符代表對象屬性,我們需要理解Python中屬性引用解析的執行方式。

對于對象來說,屬性解析機制在object.__getattribute__()中。

該方法將b.x轉換成type(b).__dict__['x'].__get__(b, type(b))。

然后,解析機制使用優先級鏈搜索屬性,在優先級鏈中,類字典中發現的數據描述符的優先級高于實例變量,實例變量優先級高于非數據描述符,如果提供了getattr(),優先級鏈會為getattr()分配最低優先級。

對于一個給定的對象類,可以通過自定義__getattribute__方法來重寫優先級鏈。

深刻理解優先級鏈之后,就很容易想出針對前面提出的第二個和第三個問題的優雅解決方案了。

那就是,利用描述符實現一個只讀屬性將變成實現數據描述符這個簡單的情況了,即不帶__set__方法的描述符。

盡管在本例中不重要,定義訪問方式的問題只需要在__get__和__set__方法中增加所需的功能即可。

類屬性每次我們想使用描述符的時候都不得不定義描述符類,這樣看起來非常繁瑣。

Python特性提供了一種簡潔的方式用來向屬性增加數據描述符。

一個屬性簽名如下所示:? 1 property(fget=None, fset=None, fdel=None, doc=None) - property attribute fget、fset和fdel分別是類的getter、setter和deleter方法。

我們通過下面的一個示例來說明如何創建屬性:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Accout(object): def __init__(self): self._acct_num = None def get_acct_num(self): return self._acct_num def set_acct_num(self, value): self._acct_num = value def del_acct_num(self): del self._acct_num acct_num = property(get_acct_num, set_acct_num, del_acct_num, Account number property.) 如果acct是Account的一個實例,acct.acct_num將會調用getter,acct.acct_num = value將調用setter,del acct_num.acct_num將調用deleter。

在Python中,屬性對象和功能可以像描述符指南中說明的那樣使用描述符協議來實現,如下所示:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 class Property(object): Emulate PyProperty_Type() in Objects/descrobject.c def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel if doc is None and fget is not None: doc = fget.__doc__ self.__doc__ = doc def __get__(self, obj, objtype=None): if obj is None: return self if self.fget is None: raise AttributeError(unreadable attribute) return self.fget(obj) def __set__(self, obj, value): if self.fset is None: raise AttributeError(can't set attribute) self.fset(obj, value) def __delete__(self, obj): if self.fdel is None: raise AttributeError(can't delete attribute) self.fdel(obj) def getter(self, fget): return type(self)(fget, self.fset, self.fdel, self.__doc__) def setter(self, fset): return type(self)(self.fget, fset, self.fdel, self.__doc__) def deleter(self, fdel): return type(self)(self.fget, self.fset, fdel, self.__doc__) Python也提供了@ property裝飾器,可以用它來創建只讀屬性。

一個屬性對象擁有getter、setter和deleter裝飾器方法,可以使用它們通過對應的被裝飾函數的accessor函數創建屬性的拷貝。

下面的例子最好地解釋了這一點:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class C(object): def __init__(self): self._x = None @property # the x property. the decorator creates a read-only property def x(self): return self._x @x.setter # the x property setter makes the property writeable def x(self, value): self._x = value @x.deleter def x(self): del self._x 如果我們想讓屬性只讀,那么我們可以去掉setter方法。

在Python語言中,描述符有著廣泛的應用。

Python函數、類方法、靜態方法都是非數據描述符的例子。

針對列舉的Python對象是如何使用描述符實現的問題,描述符指南給出了一個基本的描述。

版權聲明:本文由 柔飛瑤 整理編輯。

原標題:HID描述符,描述符類

轉載注明出處:http://www.dn9ww09s.icu/assemble/14730.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 無線網圖標,無線網圖標沒了

    無線網圖標,無線網圖標沒了 相關圖片筆記本無線網連接圖標不見了您是否遇到過win7系統中的無線網絡圖標顯示無線網絡未連接但您的計算機可以訪問Internet的情況?怎么了?我們該怎么辦?今天,超人編輯將教你如何解決...

  • python正則,python re 正則

    python正則,python re 正則 相關圖片python enumerate本文主要介紹了利用Python實現遠程FTP目錄下文件的正則匹配檢索的方法。它非常簡單實用。所需合作伙伴的參考存在問題。必須定期匹配遠程FTP目錄下的文件。如果python...

  • win7沒有管理員權限,win10管理員權限

    win7沒有管理員權限,win10管理員權限 相關圖片windows權限超人編輯器想問你是否會遇到使用win7系統卸載軟件的情況,并經常提示沒有管理員的權限。超人編輯研究后發現,這是由于當前用戶對計算機的權限不足,需要管理員權限來解...

  • 神州專車beatu,神州專車u十

    神州專車beatu,神州專車u十 相關圖片神州專車u十單子多嗎雖然Uber和滴滴打車是許多小伙伴乘坐出租車的必要選擇之一,但他們也隱藏了一定的安全風險。神舟特種車輛所提供的特種車輛服務,不存在此類隱患。在U eudriv...

  • python如何打開文件,python打開文件的路徑

    python如何打開文件,python打開文件的路徑 相關圖片python讀取文件內容本文主要介紹了Python通過wxPython打開和播放音頻文件的方法,并通過實例分析了wxPython操作音頻文件的技巧,具有一定的參考價值。需要的朋友可以參python 讀文件...

  • 又要剁手了,剁手剁手

    又要剁手了,剁手剁手 相關圖片網購剁手說說螞蟻花和信用卡是黨的日常生活中最熟悉的兩件事。他們都是以消費后付款的形式向用戶付款。但安卓版和信用卡之間的高利率是多少?螞蟻花和信用卡的性價比是多少?...

  • 隨機生成四位驗證碼,如何寫登錄隨機生成驗證碼

    隨機生成四位驗證碼,如何寫登錄隨機生成驗證碼 相關圖片生成驗證碼本文主要介紹了Python隨機生成的一個6位驗證碼共享,本文直接給出了一個代碼示例,可以參考以下1。生成的源代碼如下:?-*-編碼:UTF-8-*-導入隨機de隨機驗證碼怎么實現...

  • 拷貝,我拷貝

    拷貝,我拷貝 相關圖片把軟件的所有拷貝就能直接用嗎win7的大部分安裝都是通過CD的安裝來完成的,但是超人小版認為使用CD的安裝速度還是比較慢的。如果你想幫助別人安裝系統或安裝多臺計算機,甚至遇到...

  • JAVA中this關鍵字,js中this關鍵字用法

    JAVA中this關鍵字,js中this關鍵字用法 相關圖片Java中static關鍵字本文主要介紹在JavaScript中對這個關鍵字的深入理解。本文從方法調用模式、函數調用模式、構造函數調用模式和應用調用模式三個方面闡述了它們的區別。您可以參考...

  • 萌P,P萌圖

    萌P,P萌圖 相關圖片P社四萌每日P圖片是一個非常實用的美麗照片軟件。在這個軟件中,用戶只需點擊一下,就可以制作出充滿動漫風格的可愛大頭貼紙。那么,日P圖片大頭貼的功能在哪里呢?下一步,超...

熱評文章

  • 豆瓣和知乎那個更好用,知乎和豆瓣哪個好玩

    豆瓣和知乎那個更好用,知乎和豆瓣哪個好玩 相關圖片豆瓣vs知乎智虎和豆瓣作為國內兩個高質量、高質量的內容輸出平臺,在人氣和粉絲方面不相上下。那么哪個更好?哪個更高?讓我們看看超人知道類似豆瓣和知乎...

  • python默認編碼格式,python編碼格式轉換

    python默認編碼格式,python編碼格式轉換 相關圖片python小程序由于某些原因,有必要將代碼從機房a轉移到機房B。兩者不能相互訪問。但由于歷史原因,a機房代碼全部為utf8代碼。機房B需要GBK代碼。讓我們看看如何解決這個問題pythonut...

  • 一體手機進水一切正常,一體機手機泡水了應如何處理

    一體手機進水一切正常,一體機手機泡水了應如何處理 相關圖片一體手機進水關不了機怎么辦總有一些像小編這樣的瑪哈人,隨意地放上手機,或者握手讓他們在空中劃出一道美麗的弧線,然后跳入水中。所以,如果手機真的掉進水里或水中,實際...

  • 北京時間同步,手機時間和北京時間不同步

    北京時間同步,手機時間和北京時間不同步 相關圖片怎么設置北京時間本文主要介紹了Python的本地機與北京時間的定時同步方法,涉及到Python對時間的操作技巧,具有一定的參考價值。對于需要參考以下示例的朋友,本文介紹了Pyt北京時...

  • 交管12123收不到短信驗證碼,手機收不到交管驗證碼

    交管12123收不到短信驗證碼,手機收不到交管驗證碼 相關圖片12123號牌格式不對交管12123是官方的交通安全綜合服務管理客戶端,為車主和駕駛員提供業務預約、機動車/駕照/違章處理受理和處理、交通安全信息查詢、業務通知和提醒,商業指導和...

  • 休眠后自動重啟,休眠喚醒自動重啟

    休眠后自動重啟,休眠喚醒自動重啟 相關圖片WINDOWS系統休眠后自動重啟電腦離開電腦一段時間后就會進入睡眠狀態是一種正常現象。但是超人最近收到很多win10系統用戶的報告,稱win10系統休眠和喚醒后,計算機不再返回桌面程序,...

  • 北京時間標準,北京時間

    北京時間標準,北京時間 相關圖片北京時間校準本文主要介紹了Python獲取標準北京時間的方法,并通過實例分析了Python通過www.Beijing-time.org官方網站獲取標準北京時間的技巧。具有一美國時間與北京時間對照表...

  • 電腦突然dns未響應,怎么解決dns無響應

    電腦突然dns未響應,怎么解決dns無響應 相關圖片dns電腦服務器未響DNS服務器是用于域名和相應IP地址轉換的服務器。用戶每天訪問的網站地址必須解析為IP才能正常訪問。決議是否成功DNS服務器未響應是怎么回事...

  • win10系統圖標,win10電腦圖標

    win10系統圖標,win10電腦圖標 相關圖片win10我們都知道win10系統已經正式發布。如果您的計算機是win7和win8.1系統,您可以通過獲取windows10圖標直接將系統升級到windows10。但仍有win10界面...

  • python 正則表達式,python3正則表達式

    python 正則表達式,python3正則表達式 相關圖片JAVA正則表達式本文主要介紹Python使用正則表達式分析和替換網頁圖片的方法。它涉及到Python使用正則表達式的技巧,具有一定的參考價值。對于那些需要它的人,可以參考下面的python正...

關注微信

变脸官网查询