property和proper,proper和property有什么联系关系

  property和proper,proper和property有什么联系关系

  在绑定属性的时候,如果我们直接公开属性,虽然写起来很简单,但是没有办法检查参数,导致我们可以随意更改结果:

  s=学生()

  S.score=9999这显然是不合逻辑的。要限制分数的范围,可以通过set_score()方法设置分数,然后通过get_score()方法获取分数。这样,在set_score()方法中,可以检查参数:

  班级学生(对象):

  defget_score(self):

  回归自我。_分数

  defset_score(self,value):

  ifnotisinstance(value,int):

  raiseValueError( score mustbean integer!)

  if value 0或value100:

  raiseValueError( score must between 0 ~ 100!)

  自我。_score=value现在,你不能通过操作任何学生实例来随心所欲地设置分数:

  s=学生()

  s.set_score(60)#ok!

  s.get_score()60

  s.set_score(9999)

  回溯(mostrecentcalllast):

  .

  value error : score must介于0~100之间!但是上面的调用方法略显复杂,没有直接使用属性那么直接简单。

  有没有一个变量既能检查参数,又能像属性一样简单的访问类?对于追求完美的Python程序员来说,这是必须的!

  还记得装饰器可以动态地给函数添加函数吗?对于类的方法,装饰器也可以工作。Python内置的@property decorator负责将方法转换成属性调用:

  班级学生(对象):

  @属性

  defscore(self):

  回归自我。_分数

  @score.setter

  定义分数(自我,值):

  ifnotisinstance(value,int):

  raiseValueError( score mustbean integer!)

  if value 0或value100:

  raiseValueError( score must between 0 ~ 100!)

  自我的实现。_score=value@property很复杂。我们先来考察一下如何使用。要将getter方法转换为属性,只需添加@property。此时,@property本身创建了另一个decorator @score.setter,它负责将一个setter方法变成一个属性赋值。所以,我们有一个可控的属性操作:

  s=学生()

  S.score=60#OK,实际换算成s.set_score(60)

  S.score#OK,实际换算成s.get_score()60

  s . score=9999 trace back(mostrecentcalllast):

  .

  value error : score must介于0~100之间!注意这个神奇的@属性。当我们操作实例属性时,我们知道该属性可能不是直接公开的,而是通过getter和setter方法实现的。

  您也可以定义只读属性。仅定义了getter方法,没有setter方法是只读属性:

  班级学生(对象):

  @属性

  defbirth(自身):

  回归自我。_出生

  @birth.setter

  defbirth(自身,值):

  自我。_出生=价值

  @属性

  德法奇(自己):

  回归2015-自我。_ BirthBirthThe上面的birth是一个读写属性,而age是一个只读属性,因为年龄可以根据birth和当前时间来计算。

  

小结

@property广泛用于类的定义。它允许调用者编写简短的代码,同时确保对参数进行必要的检查。这样,程序运行时出错的可能性就降低了。

 

  更多python相关文章,请关注python自学网。

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

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