• python类与对象-如何使用描述符对实例属性做类型检查


    如何使用描述符对实例属性做类型检查

    问题举例

    在某些项目中,我们实现一些类,并希望能像静态类型语言那样对它们的

    实例属性做类型检查:

      p = Persosn()

      p.name = 'tom' #必须是str

      p.age = 18       #必须是int

    要求:

    (1)可对实例属性指定类型

    (2)赋予不正确类型时抛出异常

    分析

    class A():
        pass
    
    a = A()
    #a.x = 'hello'
    #a.__dict__['x'] = 'hello'

    a.x = 'hello'等价于a.__dict__['x'] = 'hello', 需要类提供一个接口对属性所赋的值做类型检查,手动添加属性的值

    解决思路

    使用描述符来实现需要类型检查的属性:分别实现__get__, __set__, __delete__方法,在__set__中使用isinstance函数做类型检查

    代码

    class Attr:
        def __init__(self, key, type_):
            self.key = key
            self.type_ = type_
    
        def __set__(self, instance, value):
            print('in __set__')
            if not isinstance(value, self.type_):
                raise TypeError('must be %s' % self.type_)
            instance.__dict__[self.key] = value
    
        def __get__(self, instance, cls):
            print('in __get__', instance, cls)
            return instance.__dict__[self.key]
    
        def __delete__(self, instance):
            print('in __del__', instance)
            del instance.__dict__[self.key]
    
    class Person:
        name = Attr('name', str)
        age = Attr('age', int)
    
    p = Person()
    p.name = 'tom'
    #p.age = 20
    p.age = '20'

    参考资料:python3实用编程技巧进阶

  • 相关阅读:
    Redis的事务、锁及管理命令
    Redis消息队列
    Redis管理实战
    Redis入门部署及持久化介绍
    MySQL的存储引擎
    MHA高可用及读写分离
    jquery css hover
    SqlParameter 中 top 的使用
    Jquery 操作DropDownList 根据条件选中
    js 数值格式化函数
  • 原文地址:https://www.cnblogs.com/marton/p/10816512.html
Copyright © 2020-2023  润新知