Python中的property装饰器的实现
- 2020-09-18 16:43:00
- 六月
- 转贴 578
使用property函数,把方法包装成属性,让方法可以以属性的形式被访问和调用。这里有个描述符的概念,描述符就是将某种特殊类型的类的实例指派给另一个类的属性。那什么是特殊类型的类呢?就是至少要在这个类里边定义__get__()、___set__()或___delet__()三个特殊方法中的任意一个。
例子:
#!/usr/bin/python3 class MyProperty: def __get__(self, instance, owner): print('getting ..', self, instance, owner) def __set__(self, instance, value): print('setting ..', self, instance, value) def __delete__(self, instance): print('deleting ..', self, instance) class Test: x = MyProperty() #创建类实例 test = Test() #调用__get__() test.x #调用__set__() test.x = 'abc' #调用__del__() del test.x
当访问x属性的时候,Python会自动调用描述符的__get__()方法。
通过@property方式实现装饰器
@property 语法糖提供了比 property() 函数更简洁直观的写法。
被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做属性名。
被 @属性名.setter 装饰的方法是设置属性值的方法。
被 @属性名.deleter 装饰的方法是删除属性值的方法。
class Student: def __init__(self): self._age = None @property def age(self): print('获取属性时执行的代码') return self._age @age.setter def age(self, age): print('设置属性时执行的代码') self._age = age @age.deleter def age(self): print('删除属性时执行的代码') del self._age student = Student() # 设置属性 student.age = 18 # 获取属性 print('学生年龄为:' + str(student.age)) # 删除属性 del student.age
参考: https://www.liujiangblog.com/course/python/46
https://blog.csdn.net/weixin_43265804/article/details/82863984
https://blog.csdn.net/jpch89/article/details/84026130
https://www.cnblogs.com/loveprogramme/p/9392113.html