property属性的用处,python中property的用法

  property属性的用处,python中property的用法

  在Java中,通常在类中定义的成员变量是私有变量。在类的实例中,私有变量不能通过对象直接操作。属性,而是通过getter和setter。

  在Python中,因为有了property的概念,所以不需要写一堆getter和setter的重复代码来操作私有变量。Python“私有变量”通常以“_”或“_ _”开头,如_attr或__attr,这是一个既定的规范。

  把私有属性变成只读特性

  classMyClass:

  def__init__(self,x):

  自我。_x=x这里定义了一个MyClass类,它有一个实例变量_x,绑定了用户传递的x的值。_x是私有变量,通过obj获取私有变量。_x不符合语言规范,我们只好把_x做成属性,直接通过obj访问。x.

  修改后的代码如下:

  classMyClass:

  def__init__(self,x):

  自我。_x=x

  @属性

  defx(自身):

  回归自我。_x

  obj=MyClass(10)

  对象x

  10我们把_x变成了一个属性特征,以只读的方式获取x的值。

  如果要给X赋值,现在应该怎么做?

  obj.x=999

  回溯(mostrecentcalllast):

  文件“xxx”,第14行,在模块中

  对象x=23

  可以看到错误:无法设置属性,抛出属性错误:无法设置属性。显然,只读方法不支持赋值。

  相关:《Python视频教程》

  把私有变量变成可赋值的特性

  我们只需要将上面的代码转换成:

  classMyClass:

  def__init__(self,x):

  自我。_x=x

  @属性

  defx(自身):

  回归自我。_x

  @x.setter

  defx(自身,值):

  自我。_ x=值

  obj=MyClass(10)

  obj.x=999

  对象x

  99正如你所看到的,我们为X添加了一个setter,它可以直接给obj.x赋值

  property属性能够遮盖实例属性

  继续上面的代码,让我们看看下面的操作:

  obj=MyClass(10)

  obj。__词典_ _

  {_x 3360999} #此时实例变量中有一个_x值。

  Obj。__dict__[x]=99999#设置obj的实例变量有x值,与property属性同名!

  obj。__词典_ _

  {_x 3360999, x 33609999} #此时实例变量中有_x和x值。

  obj.x#的结果是obj的实例变量还是property属性?

  10如上面的代码所示,obj对象有一个_x实例变量和一个X的property属性,我们给obj添加一个X实例变量,它和property属性X同名!

  通过obj.x我们知道返回的是property属性,也就是说property属性会覆盖实例属性!也可以理解为财产属性优先级更高!

  property类解析

  我们通常使用内置的@property decorator。但实际上,财产是一个阶级。在python中,类和函数的调用方式是相同的。它们都是可调用的对象。

  房产的建造方法如下:

  classproperty(对象):

  def__init__(self,fget=None,fset=None,fdel=None,doc=None):

  它接受4个参数,都可以是空的。

  第一个是getter,第二个是setter,第三个是delete函数,第四个是document。

  编写上述代码的另一种方法是

  classMyClass:

  def__init__(self,x):

  自我。_x=x

  defget_x(self):

  回归自我。_x

  defset_x(自身,值):

  自我。_ x=值

  x=属性(get_x,set_x)

  obj=MyClass(10)

  对象x

  10如上,X是property的实例,设置了getter和setter,它们作为类变量放在MyClass类中。

  以上是property属性的解析。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: