博客
关于我
python - 数据描述符(class 内置 get/set/delete方法 )
阅读量:804 次
发布时间: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 pandas TimeStamps到夏令时的本地时间字符串
    查看>>
    Python Pandas 用顶行替换标题
    查看>>
    Python Pandas-从DataFrame按类别绘制多个条形图
    查看>>
    Python PyQt5 将不再显示此消息复选框添加到 QMessageBox
    查看>>
    Python PyQt5:如何使用 PyQt5 显示错误消息
    查看>>
    Python pytest 面试题!
    查看>>
    Python pytz 时区函数返回一个相差 9 分钟的时区
    查看>>
    python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django
    查看>>
    Python random和json模块
    查看>>
    Python random模块seed理解
    查看>>
    python range()函数
    查看>>
    Python rdflib可传递查询
    查看>>
    python redis 集群_python 搭建redis集群
    查看>>
    python redis连接,在Python中使用Redis连接池的正确方法
    查看>>
    python regex_Python RegEx
    查看>>
    python requests post 中文结果请求得到unicode
    查看>>
    Python Requests接口自动化测试实战
    查看>>
    Python requests模块
    查看>>
    python request与grequests该如何选择
    查看>>
    python request模块
    查看>>