property 的详细使用方法

property(fget=None, fset=None, fdel=None, doc=None) 

俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择。

property() 是一个比较奇葩的BIF,它的作用把方法当作属性来访问,从而提供更加友好访问方式。

官方帮助文档代码:

  1. class C:
  2.     def __init__(self):
  3.         self._x = None
  4.     def getx(self):
  5.         return self._x
  6.     def setx(self, value):
  7.         self._x = value
  8.     def delx(self):
  9.         del self._x
  10.     x = property(getx, setx, delx, "I'm the 'x' property.")
复制代码


property() 返回一个可以设置属性的属性,当然如何设置属性还是需要我们人为来写代码。第一个参数是获得属性的方法名(例子中是 getx),第二个参数是设置属性的方法名(例子中是 setx),第三个参数是删除属性的方法名(例子中是 delx)。

property() 有什么作用呢?举个例子,在上边的例题中,我们为用户提供 setx 方法名来设置 _x 属性,提供 getx 方法名来获取属性。但是有一天你心血来潮,突然想对程序进行大改,可能你需要把 setx 和 getx 修改为 set_x 和 get_x,那你不得不修改用户调用的接口,这样子的体验就非常不好。

有了 property() 所有问题就迎刃而解了,因为像上边一样,我们为用户访问 _x 属性只提供了 x 属性。无论我们内部怎么改动,只需要相应的修改 property() 的参数,用户仍然只需要去操作 x 属性即可,对他们来说没有任何影响。


使用属性修饰符创建描述符

使用属性修饰符创建描述符,也可以实现同样的功能(【扩展阅读】Python 函数修饰符(装饰器)的使用):

官方帮助文档代码:

  1. class C:
  2.     def __init__(self):
  3.         self._x = None
  4.     @property
  5.     def x(self):
  6.         """I'm the 'x' property."""
  7.         return self._x
  8.     @x.setter
  9.     def x(self, value):
  10.         self._x = value
  11.     @x.deleter
  12.     def x(self):
  13.         del self._x
复制代码


注意:三个处理 _x 属性的方法名要相同(参数不同)。

原文地址:https://www.cnblogs.com/fclbky/p/4098191.html