property
- 在我们定义类的时候,希望某些属性实例化的时候按照我们既定的方式进行,比如age属性,按照常理应该为int类型,可以在类的定义中使用@property,创建动态属性。
如下代码,对age属性使用装饰器添加新的功能。而不需要对属性进行初始化,类似于创建了一个空变量,等待为其赋值。 ```python class Student(object): @property def age(self):
# 当访问age属性时返回的值
return self.__age
@age.setter def age(self, value):
# value为绑定的值
if value > 200 or value <= 0:
raise TypeError("输入年龄不对")
elif not isinstance(value, int):
raise TypeError("年龄为数值")
else:
self.__age = value
student = Student() student.age = 1000 print(student.age)
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1325594/1594820096147-f5ce581e-4511-4a29-83d2-c8bbd6b58283.png#align=left&display=inline&height=83&margin=%5Bobject%20Object%5D&name=image.png&originHeight=145&originWidth=1310&size=61122&status=done&style=none&width=746)
- 当为student.age为100时:
```python
student.age = 100
属性描述符
- 当我们的类中的属性很多,对属性要求也很多的时候,再使用property的时候会显得代码十分冗余,可以使用属性描述符。
- get() 获取属性
- set() 设置属性
- del() 删除属性
- 当只有get方法的时候称之为非数据描述符
- 同时拥有get、set方法的时候称之为数据描述符
同时拥有get、set、del方法的时候称之为属性描述符 ```python class IntObject(object): def init(self):
self.value = None
def get(self, obj, value):
if self.value:
return self.value
else:
raise TypeError("没有")
def set(self, obj, value):
if isinstance(value, int):
self.value = value
else:
raise TypeError("不是整数")
def del(self):
print("被删除")
class Student(object): age = IntObject() ```