使用Python怎么实现一个@ property动态属性

  介绍

本篇文章给大家分享的是有关使用Python怎么实现一个@ property动态属性,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Python可以做什么

Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂,容易入门,功能强大,在许多领域中都有广泛的应用,例如最热门的大数据分析,人工智能,网页开发等。

class 学生:   def 才能__init__(自我,,名字):   ,,,self.name =,名字   ,,,self.score =,没有      mike =,学生(& # 39;迈克# 39;)

考试完以后,准备给迈克打分:

mike.score =, 999

在这里,老师一不小心多打了个9,通常来说打分都是100分值,999是一个非法数据,不应该赋值成功。学生一多,老师打分出现手误的情况肯定会越来越多,所以我们必须想办法修改程序,限制分数的值必须在0 - 100分。

<强>限制值

我们定义一个方法,如果输入的不是0 - 100的整数,就让程序报错,数据合法,我们就把分数属性修改成功。

def  set_score(自我,,new_score):   if 才能;not  isinstance (new_score, int):   ,,,raise  ValueError (& # 39; score  must  be  int # 39;)      if 才能;0,& lt;=, new_score  & lt;=, 100:   ,,,self.score =new_score   ,,,return  self.score   其他的才能:   ,,,raise  ValueError (& # 39; score 无效# 39;)

这样我们每次需要获取成绩的时候使用自我。成绩获取,修改成绩的时候调用函数来修改:

mike.set_score (999)

调用以后会报错,因为999是非法数据。注意,这个时候我使用自我。分数还是可以进行设置,而且不报错:

self.score =, 999

这显然是不行的,所以我们要提供一种机制,把分数变成私有属性,不能让外部访问。很遗憾,python的私有属性是伪私有。通常我们把_开头的属性叫私有属性,但是这只是一种协议和规定,你看到下划线开头的属性,不要去访问了。你硬要访问,是可以的,python并不会禁止。

<强>使用@ property的方式代替。

上面的方法虽然实现了功能,但是改变了属性的使用方式。平常是这样使用的:

#,获取属性   a =mike.score   #,设置属性   mike.score =99      @ property   def 分数(自我):   return  self._score才能      @score.setter   def 分数(自我,,new_score):   if 才能;not  isinstance (new_score, int):   ,,,raise  ValueError (& # 39; score  must  be  int # 39;)      ,,,if  0, & lt;=, new_score  & lt;=, 100:   ,,,,,self._score =new_score   ,,,,,return  self._score   ,,,:   ,,,,,raise  ValueError (& # 39; score 无效# 39;)

<强>动态属性的好处

<李>

统一了调用方式.self。分数=99的方式,而不是函数调用的方式。

<李>

_score我们就不直接去使用了。你要用也可以,不建议。

<李>

如果我们一个属性只可以读,把setter部分注释掉就可以了。

现在我们来完善这个类,添加出生属性和年龄属性:

得到datetime  import  datetime      class 学生:   def 才能;__init__(自我,,名字,,出生=1920):   ,,,self.name =,名字   ,,,self._score =,没有   ,,,self.birth =出生   ,,,self.age =, datetime.now () .year 作用;self.birth      时间=mike 学生(& # 39;迈克# 39;)   打印(mike.birth)   打印(mike.age)

出生和年龄这两个是可以根据一个求出另外一个的。存在数据冗余问题。

年龄属性这样是有问题的.mike初始化的时候,年龄已经被求出来了,如果我在下一年再去访问年龄属性,那他就是个错误的值。可以通过把年龄设成现在的秒数来验证:

self.age =, datetime.now(),接着      时间=mike 学生(& # 39;迈克# 39;)   time . sleep (5)   打印(mike.age)   print (datetime.now(),接着)

<强>动态显示

@ property   def 年龄(自我):   return 才能datetime.now () .year 作用;自我。出生

注意,这里不要去设置@age。setter,因为他是动态变化的,你修改了会造成数据不一致,它只能作为一个只读属性。

使用Python怎么实现一个@ property动态属性