博客
关于我
python - 数据描述符(class 内置 get/set/delete方法 )
阅读量:799 次
发布时间:2023-03-05

本文共 1926 字,大约阅读时间需要 6 分钟。

数据描述符(class 内置 get/set/del 方法)

什么是描述符?

描述符是一种具有“捆绑行为”的对象属性。访问(获取、设置和删除)它的属性时,实际是调用特殊的方法(get(), set(), delete())。也就是说,如果一个对象定义了这三种方法的任何一种,它就是一个描述符。

通常情况下,访问一个对象的搜索链是怎样的?比如 a.x,首先查询 a._dict_['x'],然后是 type(a)._dict_['x'],一直向上查找,直到找到元类为止(不包括元类)。如果这个属性是一个描述符,Python就会“拦截”这个搜索链,取而代之调用描述符方法(get)。

描述符的作用

默认行为是从对象的字典中获取、设置或删除属性。但是,如果属性是一个描述符,Python会调用描述符的相关方法。例如,a.x 可能会调用 Foo._get_ 方法,而不是直接从 a._dict_ 中查找。

数据描述符与非数据描述符

  • 数据描述符:定义了 _get__set_ 方法的对象。
  • 非数据描述符:只定义了 _get_ 方法的对象。通常情况下,非数据描述符是非数据描述符。

区别

  • 属性访问顺序

    • 数据描述符 > 实例属性 > 类属性 > 父类属性 > __getattr__() 方法。
    • 非数据描述符 > 实例属性 > 类属性 > 父类属性 > __getattr__() 方法。
  • 方法定义

    • 数据描述符:定义了 _get_, _set_, 和 _delete_ 方法。
    • 非数据描述符:通常只定义了 _get_ 方法。
  • 描述符的三种方法

    • get(self, instance, owner):获取属性时调用,返回设置的属性值。
    • set(self, instance, value):设置属性时调用,返回 None
    • delete(self, instance):删除属性时调用,返回 None

    数据描述符的作用

    数据描述符会改变属性的基本获取、设置和删除方式。它可以用于以下场景:

  • 在设置属性时,进行某些检测或操作。
  • 为属性赋值时,执行某些业务逻辑。
  • 防止属性被错误地修改或删除。
  • 示例

    class Foo:    def __get__(self, instance, owner):        print("执行Foo get方法")    def __set__(self, instance, value):        print("执行Foo set方法")    def __delete__(self):        print("执行Foo del方法")class Test:    x = Foo()    def __init__(self, num):        self.x = num# 由于 `x` 是数据描述符,赋值会调用 `Foo.__set__` 方法abc = Test(100)print(abc.x)

    输出结果:

    • 执行Foo set方法
    • 执行Foo get方法
    • {}(abc.__dict__ 中没有 x

    练习:描述符应用 - 判断录入类型是否合规

    class Test:    def __init__(self, key, type_data):        self.key = key        self.type_data = type_data    def __set__(self, instance, value):        if isinstance(value, self.type_data):            instance.__dict__[self.key] = value        else:            print("赋值类型错误")class People:    name = Test('name', str)    def __init__(self, name, old):        self.name = name        self.old = old# 赋值为 str 类型name = 'anec'# 赋值为 int 类型name2 = 123abc = People(name, 23)abc2 = People(name2, 24)print(abc.__dict__)print(abc2.__dict__)

    运行结果:

    • abc.__dict__ 中没有 name,因为 name 是数据描述符
    • abc2.__dict__ 中包含 name,因为 name2 是整数类型,触发了错误提示

    转载地址:http://ysafk.baihongyu.com/

    你可能感兴趣的文章
    python - 数据描述符(class 内置 get/set/delete方法 )
    查看>>
    Python - 根据值绘制彩色网格
    查看>>
    Python - 正则表达式在括号之间获取数字
    查看>>
    Python - 正则表达式在括号之间获取数字
    查看>>
    Python - 正则表达式在括号之间获取数字
    查看>>
    Python - 类 __hash__ 方法和集合
    查看>>
    Python - 轻松将文本文件内容转换为字典值/键
    查看>>
    Python - 递归和列表
    查看>>
    python -- 小数据池 is和 == 再谈编码
    查看>>
    Python 3 中未定义名称“xrange“
    查看>>
    python进阶(5):魔术方法篇(1)
    查看>>
    Python 3 范围与 Python 2 范围
    查看>>
    Python 3 读取ini文件
    查看>>
    Python 3.0 使用 turtle.onclick
    查看>>
    Python 3.10 明年发布,看看都有哪些新特性?
    查看>>
    python 3.10上安装pyqt5
    查看>>
    Python 3.12 正式发布了!
    查看>>
    Python 3.2 中的蛮力脚本
    查看>>
    Python 3.4 多处理递归 Pool.map()
    查看>>
    Python 3.4:未知格式代码“x“
    查看>>