zoukankan      html  css  js  c++  java
  • 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实用编程技巧进阶

  • 相关阅读:
    BZOJ2039: [2009国家集训队]employ人员雇佣
    BZOJ2542: [Ctsc2001]终极情报网
    BZOJ2140: 稳定婚姻
    BZOJ3280: 小R的烦恼
    BZOJ3258: 秘密任务
    BZOJ2400: Spoj 839 Optimal Marks
    BZOJ3171: [Tjoi2013]循环格
    BZOJ1758: [Wc2010]重建计划
    BZOJ3175: [Tjoi2013]攻击装置
    机房破解程序
  • 原文地址:https://www.cnblogs.com/marton/p/10816512.html
Copyright © 2011-2022 走看看