博客
关于我
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 asyncio库的学习和使用
    查看>>
    Python AttributeError:“dict“对象没有属性“append“
    查看>>
    Python base64和hashlib模块
    查看>>
    python basic programs
    查看>>
    python bert_gen.py 报错Unable to load weights from pytorch checkpoint file for......
    查看>>
    python binascii.Error: Incorrect padding
    查看>>
    Python bool() 函数能否为无效参数引发异常?
    查看>>
    Python C 程序子进程在“for line in iter“处挂起
    查看>>
    Python Celery:自动化测试平台定时任务必备的三方库
    查看>>
    python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令
    查看>>
    Python CONNECT 4 CHECK WIN函数
    查看>>
    python cos,Python cos(90)和cos(270)不是0
    查看>>
    python进阶(4):Python 脚本文件重启自身进程
    查看>>
    python ctypes库中动态链接库加载方式
    查看>>
    python cv2 图像( np array )转 HObject
    查看>>
    python进阶(3):文件操作
    查看>>
    python cv2截取不规则区域图片
    查看>>
    python CV2裁剪图片并保存
    查看>>
    python进阶(2):pyecharts使用
    查看>>
    python cv2读取rtsp实时码流按时生成连续视频文件
    查看>>