最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Python對象的描述器機制

 更新時間:2025年05月29日 08:30:46   作者:燭陰  
在Python中,“描述器”是一種能夠自定義對象屬性訪問(獲取、設置、刪除)行為的協(xié)議,它是實現(xiàn)@property、類屬性、ORM字段、類型檢查的底層支撐,本文將帶你玩轉(zhuǎn)Python對象的描述器機制,需要的朋友可以參考下

一、什么是Python描述器?

在Python中,“描述器”是一種能夠自定義對象屬性訪問(獲取、設置、刪除)行為的協(xié)議。它是實現(xiàn)@property、類屬性、ORM字段、類型檢查的底層支撐。

一句話解釋:只要一個對象定義了__get__、__set____delete__等特殊方法,并作為另一個類的類屬性,這個對象就成了描述器!

默認對屬性的訪問控制是從對象的字典里面 (__dict__) 中獲取 (get) , 設置 (set) 和刪除 (delete) 。

舉例來說, a.x 的查找順序是, a.__dict__['x'] , 然后 type(a).__dict__['x'] , 然后找 type(a) 的父類 ( 不包括元類 (metaclass) ).如果查找到的值是一個描述器, Python 就會調(diào)用描述器的方法來重寫默認的控制行為。

二、描述器協(xié)議:三大魔法方法

方法作用用法場景
__get__獲取屬性時調(diào)用動態(tài)計算、懶加載
__set__設置屬性時調(diào)用數(shù)據(jù)驗證、只讀限制
__delete__刪除屬性時調(diào)用管控屬性生命周期

最簡單的描述器雛形:

class DemoDescriptor:
    def __get__(self, instance, owner):
        print('執(zhí)行了__get__')
        return 42

class MyClass:
    x = DemoDescriptor()

obj = MyClass()
print(obj.x)  # 輸出42,中間會打印“執(zhí)行了__get__”

三、入門實戰(zhàn):搞懂描述器工作的方式

3.1 數(shù)據(jù)描述器 VS 非數(shù)據(jù)描述器

  • 數(shù)據(jù)描述器 : 同時定義了__get____set__
  • 非數(shù)據(jù)描述器 : 只定義了__get__

數(shù)據(jù)描述器擁有更高優(yōu)先級,會屏蔽實例字典上的同名屬性!

3.2 數(shù)據(jù)描述器基礎案例

class Typed:
    def __init__(self, name, typ):
        self.name = name
        self.typ = typ

    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, self.typ):
            raise TypeError(f'屬性{self.name}必須是{self.typ}')
        instance.__dict__[self.name] = value

class Person:
    age = Typed('age', int)    # 用描述器控制
    name = Typed('name', str)

p = Person()
p.age = 18            # 自動類型檢查
p.name = '小明'
# p.age = 'not int'   # 拋出TypeError

四、@property 與描述器的關(guān)系

你用過的@property,其實就是“非數(shù)據(jù)描述器”的語法糖:

class Demo:
    @property
    def val(self):
        return 666

底層實現(xiàn)和你定義帶__get__的對象如出一轍。

五、進階:自定義描述器封裝與通用實現(xiàn)

5.1 描述器工廠 基于裝飾器快速生成校驗字段

def typed_field(name, typ):
    class _TypedDescriptor:
        def __get__(self, instance, owner):
            return instance.__dict__[name]
        def __set__(self, instance, value):
            if not isinstance(value, typ):
                raise TypeError(f"屬性{name}必須是{typ}")
            instance.__dict__[name] = value
    return _TypedDescriptor()

class Student:
    age = typed_field('age', int)
    name = typed_field('name', str)

stu = Student()
stu.age = 18    # √
# stu.age = 'oops' # TypeError

5.2 只讀屬性描述器

class ReadOnly:
    def __init__(self, value):
        self._value = value
    def __get__(self, instance, owner):
        return self._value

class System:
    version = ReadOnly('1.0.0')

print(System.version)   # '1.0.0'

到此這篇關(guān)于一文搞懂Python對象的描述器機制的文章就介紹到這了,更多相關(guān)Python對象描述器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python求解任意閉區(qū)間的所有素數(shù)

    Python求解任意閉區(qū)間的所有素數(shù)

    本篇文章是一篇關(guān)于python求素數(shù)的知識點內(nèi)容,如果大家在應用中有用的到,不妨跟著學習下。
    2018-06-06
  • 如何在Python3中使用telnetlib模塊連接網(wǎng)絡設備

    如何在Python3中使用telnetlib模塊連接網(wǎng)絡設備

    這篇文章主要介紹了如何在Python3中使用telnetlib模塊連接網(wǎng)絡設備,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 使用Python處理Excel表格的簡單方法

    使用Python處理Excel表格的簡單方法

    這篇文章主要介紹了使用Python處理Excel表格的簡單方法,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2018-06-06
  • python基礎教程之自定義函數(shù)介紹

    python基礎教程之自定義函數(shù)介紹

    這篇文章主要介紹了python基礎教程之自定義函數(shù)介紹,本文講解了python中函數(shù)的定義方法、函數(shù)參數(shù)的定義方法,需要的朋友可以參考下
    2014-08-08
  • Pycharm及python安裝詳細步驟及PyCharm配置整理(推薦)

    Pycharm及python安裝詳細步驟及PyCharm配置整理(推薦)

    這篇文章主要介紹了Pycharm及python安裝詳細步驟以及PyCharm配置整理,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Python操作Excel神器openpyxl使用教程(超詳細!)

    Python操作Excel神器openpyxl使用教程(超詳細!)

    openpyxl庫是一個很好處理xlsx的python庫,下面這篇文章主要給大家介紹了關(guān)于Python辦公自動化openpyxl使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • python 引用傳遞和值傳遞詳解(實參,形參)

    python 引用傳遞和值傳遞詳解(實參,形參)

    這篇文章主要介紹了python 引用傳遞和值傳遞詳解(實參,形參)。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python中的yield淺析

    Python中的yield淺析

    這篇文章主要介紹了Python中的yield淺析,對迭代器(iterator) 、生成器(constructor)一并做了分析,并用實例來說明,需要的朋友可以參考下
    2014-06-06
  • 解決python文件字符串轉(zhuǎn)列表時遇到空行的問題

    解決python文件字符串轉(zhuǎn)列表時遇到空行的問題

    下面小編就為大家?guī)硪黄鉀Qpython文件字符串轉(zhuǎn)列表時遇到空行的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Python+Yolov5人臉口罩識別的詳細步驟

    Python+Yolov5人臉口罩識別的詳細步驟

    人臉口罩佩戴檢測(識別)是當前急需的應用,而YOLOv5是目前流行的強悍的目標檢測技術(shù),下面這篇文章主要給大家介紹了關(guān)于Python+Yolov5人臉口罩識別的相關(guān)資料,需要的朋友可以參考下
    2022-12-12

最新評論

五寨县| 江西省| 公主岭市| 婺源县| 阿城市| 鹤岗市| 郧西县| 涪陵区| 泰兴市| 盐津县| 新乐市| 新乐市| 武冈市| 腾冲县| 梁平县| 普定县| 西充县| 通许县| 平阴县| 莱阳市| 西平县| 武平县| 师宗县| 慈利县| 桂平市| 雅江县| 广宁县| 弥渡县| 永川市| 陕西省| 阿拉尔市| 湘潭市| 华坪县| 汾阳市| 乌审旗| 合肥市| 榆社县| 外汇| 龙山县| 潞城市| 会宁县|