property提供了一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。property接受4个可选参数:fget, fset, fdel, doc。
我们来看一个例子:
可以使用property函数来封装关于一个对象的get和set函数,并且返回一个对象,使用返回的对象(width,height)时,property会自动根据代码语境选择对应的函数,我们来运行一下这个程序,并且在运行程序的ipython中执行以下命令:
从测试程序中可以看出,直接使用property()函数也是能正常如期的工作的,但是考虑类的继承的情况:
我们执行一个测试样例:
可以看到虽然子类修改了_width_get()的实现,但是无法覆盖父类中由property()函数修饰的fget方法。
对于这个问题,只需要在子类中重写整个property,
我们再运行测试样例:
这时候子类就覆盖了父类中的fget方法。
但是这样写的缺点是可维护性不好,如果开发者要修改父类,而忘记修改property调用的话,就会出现问题。
使用property的最佳实践是使用property作为装饰器,这样就会避免可维护性的问题,而且减少类内部方法签名的数量。
最佳实践