正如一开始的图片所示,@property是一件十分之方便的工具,正如c#里面的get与set的语法糖似的,可以帮助我们快速的实现对象的约束,而不需要为其建立麻烦的getter与setter方法。
那么这个@property是一种怎么样的实现方式呢?
从语法上可以推测其实这是一种方法装饰器,本质上就是对这个方法进行一次加工与包装,使得其能够符合我们的使用意愿去进行操作。但是,其实@property还有一种操作方式那就是
1 | class Object(object): |
在为property对象分别写入了get,set,del方法之后,x也同样拥有了以上的属性,可以看出,虽然@property利用了装饰器的语法,但是实际上内部的操作并不是如同装饰器一般对函数进行包装的。
@property的实现原理
从Python源码来看property的基本结构就是get,set,del三个方法和对应这三个方法的成员变量
1 | //property包含了get,set,del三个方法 |
然后,根据初始化方法可以看出需要输入get,set,del三个方法的函数指针(默认为None),然后会根据fget,fset,fdel所指向的函数作为改对象的get,set,del方法
1 | static int |
而@property当中的getter,setter,deleter方法则是建立了一个Copy了一个新的@property对象给对应的函数
1 | // getter方法 |
@property的Python实现
根据源码的实现可以在python层实现一个@property系统
1 | class PyProperty(object): |
在@property里的getter,setter,deleter方法的实质上就是使用装饰的函数重写为了对应对象的get,set,delete方法从而达到了包装属性的神奇的效果,也完成了函数->成员变量的包装的变化。