神奇的描述符(二):使用描述符实现实例属性的类型检查
因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作。
先定义一个描述符 Point,用于管理坐标信息。
class Point: def __init__(self, name): self.name = name def __get__(self, instance, owner): # 通常情况下,通过类属性访问描述符时,返回描述符自身 if instance is None: return self # 通过实例属性访问描述符时,返回实例 else: return instance.__dict__[self.name] def __set__(self, instance, value): try: # 检查坐标格式是否有异常 x, y = value instance.__dict__[self.name] = x, y except TypeError: raise TypeError('无效的坐标信息')
定义一个Address类,及类属性home,home接收一个坐标信息
class Address: home = Point('myhome')
实例化Address,并对实例属性进行赋值
addr = Address() # 将坐标信息赋值给home addr.home = 123, 321 print(addr.home) # (123, 321) # 错误的赋值 addr.home = 123 # TypeError: 无效的坐标信息
第一次,赋值给home一个正确的坐标信息: 123, 321,符合point的赋值要求,并且能通过 addr.home 读取。
第二次,赋值给home 一个 int 类型的变量 123,因为描述符会接管实例属性的读写,所以在赋值时,执行的是Point描述符的 __set__ 的方法,在对 value 进行解包时,int 类型无法解包,引发
TypeError异常,赋值失败,达到了对实例属性进行类型检查的效果。