property

  • 在我们定义类的时候,希望某些属性实例化的时候按照我们既定的方式进行,比如age属性,按照常理应该为int类型,可以在类的定义中使用@property,创建动态属性。
  • 如下代码,对age属性使用装饰器添加新的功能。而不需要对属性进行初始化,类似于创建了一个空变量,等待为其赋值。 ```python class Student(object): @property def age(self):

    1. # 当访问age属性时返回的值
    2. return self.__age

    @age.setter def age(self, value):

    1. # value为绑定的值
    2. if value > 200 or value <= 0:
    3. raise TypeError("输入年龄不对")
    4. elif not isinstance(value, int):
    5. raise TypeError("年龄为数值")
    6. else:
    7. self.__age = value

student = Student() student.age = 1000 print(student.age)

  1. ![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)
  2. - 当为student.age100时:
  3. ```python
  4. student.age = 100

image.png

属性描述符

  • 当我们的类中的属性很多,对属性要求也很多的时候,再使用property的时候会显得代码十分冗余,可以使用属性描述符。
    • get() 获取属性
    • set() 设置属性
    • del() 删除属性
  • 当只有get方法的时候称之为非数据描述符
  • 同时拥有get、set方法的时候称之为数据描述符
  • 同时拥有get、set、del方法的时候称之为属性描述符 ```python class IntObject(object): def init(self):

    1. self.value = None

    def get(self, obj, value):

    1. if self.value:
    2. return self.value
    3. else:
    4. raise TypeError("没有")

    def set(self, obj, value):

    1. if isinstance(value, int):
    2. self.value = value
    3. else:
    4. raise TypeError("不是整数")

    def del(self):

    1. print("被删除")

class Student(object): age = IntObject() ``` image.png