8.9 可以以描述符类的形式定义其功能。
>>> class I:
... def __init__(self,name):
... self.name = name
... def __get__(self,instance,cls):
... if instance is None:
... return self
... else:
... return instance.__dict__[self.name]
... def __set__(self,instance,value):
... if not isinstance(value,int):
... raise TypeError("Expected an int")
... instance.__dict__[self.name]=value
... def __delete__(self,instance):
... del instance.__dict__[self.name]
...
>>>
- 所谓的描述符就是以特殊方法 get set delete 的形式实现了三个核心的属性访问操作的类。
- 这些方法通过接受类实例作为输入来工作。之后,底层的实例字典会根据需要适当的进行调整
- 要使用一个描述符,我们把描述符的实例放置在类的定义中作为类变量来用。
>>> class P:
... x = I('x')
... y = I('y')
... def __init__(self,x,y):
... self.x=x
... self.y=y
...
- 当这么做时,所有针对描述符属性(即使 x或y)的访问都会给 get set和delete方法所捕获,如下:
>>> p =P(2,3)
>>> p.x
2
>>> p.y
3
>>> p.x=2.3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 11, in __set__
TypeError: Expected an int
>>> p.x=3
>>> p.x
3
>>>
网友评论