神奇的描述符(二):使用描述符实现实例属性的类型检查

因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作。

先定义一个描述符 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异常,赋值失败,达到了对实例属性进行类型检查的效果。

posted @ 2017-07-14 08:57  BlackMatrix  阅读(289)  评论(0编辑  收藏  举报