欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你搞懂Python中的描述符(Descriptor)

 更新時(shí)間:2023年06月21日 08:53:20   作者:小小張說故事  
Python是一種動(dòng)態(tài)類型語言,這意味著我們可以在運(yùn)行時(shí)更改對(duì)象的結(jié)構(gòu),這種靈活性有時(shí)可能會(huì)導(dǎo)致問題,例如我們可能無意中改變了一個(gè)屬性的值,為了解決這些問題,Python提供了一個(gè)強(qiáng)大的特性:描述符,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、什么是描述符?

在Python中,描述符是一個(gè)實(shí)現(xiàn)了特定協(xié)議的對(duì)象。這個(gè)協(xié)議包括__get__()、__set__()__delete__()方法。描述符使我們可以在訪問、設(shè)置或刪除屬性時(shí)定義額外的行為。

描述符主要用于管理對(duì)特定屬性的訪問。當(dāng)你在類中定義了一個(gè)描述符,Python會(huì)在你訪問該屬性時(shí)使用描述符中定義的行為,而不是直接訪問對(duì)象的字典。

讓我們看一個(gè)簡(jiǎn)單的例子,一個(gè)只讀的描述符:

class ReadOnly:
    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name
    def __get__(self, obj, objtype):
        return self.val
    def __set__(self, obj, val):
        raise AttributeError(f"{self.name} is read-only")
class MyClass:
    attr = ReadOnly(10, 'attr')

在這個(gè)例子中,ReadOnly是一個(gè)描述符。當(dāng)我們嘗試設(shè)置MyClassattr屬性時(shí),它會(huì)拋出一個(gè)AttributeError,因?yàn)?code>attr是只讀的。

二、描述符的類型

在Python中,有兩種類型的描述符:數(shù)據(jù)描述符和非數(shù)據(jù)描述符。

數(shù)據(jù)描述符是定義了__set__()__delete__()方法的描述符。當(dāng)一個(gè)數(shù)據(jù)描述符和一個(gè)實(shí)例字典中的項(xiàng)有相同的名字時(shí),數(shù)據(jù)描述符將具有更高的優(yōu)先級(jí)。

非數(shù)據(jù)描述符只定義了__get__()方法。如果實(shí)例字典中有相同名字的項(xiàng),那么這個(gè)項(xiàng)將具有更高的優(yōu)先級(jí)。

三、使用描述符

描述符通常用于實(shí)現(xiàn)高級(jí)功能,例如數(shù)據(jù)驗(yàn)證、屬性訪問日志記錄、類型檢查等。下面我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類型檢查描述符:

class Typed:
    def __init__(self, name, required_type):
        self.name = name
        self.required_type = required_type
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]
    def __set__(self, instance, value):
        if not isinstance(value, self.required_type):
            raise TypeError(f"Expected {self.required_type}")
        instance.__dict__[self.name] = value
class MyClass:
    attr = Typed('attr', int)

在這個(gè)例子中,Typed描述符確保attr屬性總是一個(gè)整數(shù)。如果我們嘗試設(shè)置一個(gè)非整數(shù)值,就會(huì)拋出一個(gè)TypeError。

總的來說,描述符提供了一種優(yōu)雅而強(qiáng)大的方式來管理對(duì)象的屬性。它們?yōu)閿?shù)據(jù)封裝、自定義數(shù)據(jù)類型、屬性驗(yàn)證和計(jì)算屬性提供了無盡的可能性。理解和使用描述符可以幫助我們寫出更清晰、更靈活和更健壯的代碼。

以下是如何使用這個(gè)Typed描述符的例子:

my_obj = MyClass()
my_obj.attr = 10
print(my_obj.attr)  # Output: 10
try:
    my_obj.attr = 'hello'
except TypeError as e:
    print(e)  # Output: Expected <class 'int'>

在這個(gè)例子中,你可以看到當(dāng)我們?cè)噲D給attr賦值一個(gè)非整數(shù)值時(shí),描述符會(huì)引發(fā)一個(gè)TypeError。

描述符不僅可以用于類型檢查,還可以用于許多其他有用的功能,例如數(shù)據(jù)綁定、讀寫權(quán)限控制、自動(dòng)更新屬性值等。當(dāng)你需要在獲取、設(shè)置或刪除屬性時(shí)執(zhí)行特定的操作時(shí),描述符可能會(huì)是一個(gè)很好的選擇。

四、描述符的高級(jí)用法

描述符的常見用法是實(shí)現(xiàn)屬性的數(shù)據(jù)綁定和數(shù)據(jù)驗(yàn)證。然而,描述符還有一些高級(jí)的用法,例如延遲計(jì)算和函數(shù)重載。以下是一個(gè)使用描述符實(shí)現(xiàn)延遲計(jì)算的例子:

class LazyProperty:
    def __init__(self, function):
        self.function = function
        self.name = function.__name__
    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        value = self.function(obj)
        setattr(obj, self.name, value)
        return value
class MyClass:
    @LazyProperty
    def expensive_computation(self):
        print("Computing...")
        return sum(range(1000000))
my_instance = MyClass()
print(my_instance.expensive_computation)  # Output: Computing... 499999500000
print(my_instance.expensive_computation)  # Output: 499999500000

在這個(gè)例子中,expensive_computation屬性在第一次訪問時(shí)執(zhí)行一次昂貴的計(jì)算,之后的訪問會(huì)直接返回已經(jīng)計(jì)算出的結(jié)果。

五、描述符的局限性

雖然描述符是一個(gè)強(qiáng)大的特性,但它也有一些局限性。首先,描述符只能在新式類中使用。另外,描述符的行為依賴于其在類中的定義順序,這有時(shí)可能會(huì)導(dǎo)致意料之外的結(jié)果。最后,描述符對(duì)類屬性的管理是全局的,無法針對(duì)單個(gè)實(shí)例進(jìn)行定制。

盡管有這些局限性,描述符仍然是Python中一個(gè)非常有用的工具。通過理解和利用描述符,我們可以編寫出更安全、更靈活的代碼。

希望這篇文章能幫助你理解Python中的描述符,以及如何使用它們來提高代碼的質(zhì)量和靈活性。

以上就是一文帶你搞懂Python中的描述符(Descriptor)的詳細(xì)內(nèi)容,更多關(guān)于Python 描述符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python遞歸及尾遞歸優(yōu)化操作實(shí)例分析

    Python遞歸及尾遞歸優(yōu)化操作實(shí)例分析

    這篇文章主要介紹了Python遞歸及尾遞歸優(yōu)化操作,結(jié)合實(shí)例形式分析了Python遞歸及尾遞歸優(yōu)化相關(guān)概念、原理、應(yīng)用與操作技巧,需要的朋友可以參考下
    2020-02-02
  • Python 實(shí)現(xiàn)使用空值進(jìn)行賦值 None

    Python 實(shí)現(xiàn)使用空值進(jìn)行賦值 None

    這篇文章主要介紹了Python 實(shí)現(xiàn)使用空值進(jìn)行賦值 None,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 基于pycharm實(shí)現(xiàn)批量修改變量名

    基于pycharm實(shí)現(xiàn)批量修改變量名

    這篇文章主要介紹了基于pycharm實(shí)現(xiàn)批量修改變量名,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 淺析Python函數(shù)式編程

    淺析Python函數(shù)式編程

    在本篇文章中我們給大家分享了關(guān)于Python函數(shù)式編程的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友參考下。
    2018-10-10
  • pycharm設(shè)置注釋顏色的方法

    pycharm設(shè)置注釋顏色的方法

    今天小編就為大家分享一篇pycharm設(shè)置注釋顏色的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 使用python字典統(tǒng)計(jì)CSV數(shù)據(jù)的步驟和示例代碼

    使用python字典統(tǒng)計(jì)CSV數(shù)據(jù)的步驟和示例代碼

    為了使用Python字典來統(tǒng)計(jì)CSV數(shù)據(jù),我們可以使用內(nèi)置的csv模塊來讀取CSV文件,并使用字典來存儲(chǔ)統(tǒng)計(jì)信息,以下是一個(gè)詳細(xì)的步驟和完整的代碼示例,需要的朋友可以參考下
    2024-12-12
  • Python程序退出方式小結(jié)

    Python程序退出方式小結(jié)

    這篇文章主要介紹了Python程序退出方式小結(jié),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • 小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)

    小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)

    Python函數(shù)的默認(rèn)值參數(shù)只會(huì)在函數(shù)定義處被解析一次,以后再使用時(shí)這個(gè)默認(rèn)值還是一樣,這在與可變參數(shù)共同使用時(shí)便會(huì)產(chǎn)生困惑,下面就來小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)
    2016-06-06
  • 解決Python 命令行執(zhí)行腳本時(shí),提示導(dǎo)入的包找不到的問題

    解決Python 命令行執(zhí)行腳本時(shí),提示導(dǎo)入的包找不到的問題

    今天小編就為大家分享一篇解決Python 命令行執(zhí)行腳本時(shí),提示導(dǎo)入的包找不到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過來看看吧
    2019-01-01
  • Python圖像處理之圖片拼接和堆疊案例教程

    Python圖像處理之圖片拼接和堆疊案例教程

    這篇文章主要介紹了Python圖像處理之圖片拼接和堆疊案例教程,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論