python中property的用法,python中的property函数_1

  python中property的用法,python中的property函数

  本文主要介绍Python中property属性的相关信息。简单来说,一旦类中的方法被@property修饰,就可以像调用属性一样调用这个方法。可以简化调用者获取数据的过程,不用担心暴露属性,会有人分配。下面的朋友可以参考一下。

  00-1010序言限制值由@property替换。动态属性的好处附加动态显示:用属性替换getter和setter方法的总结

  

目录

  Python动态属性的概念可能会在面试中被问到,在项目中也很实用,但一般编程教程中不会提到,可以学习一下。

  让我们看一个简单的例子。创建一个学生类。希望通过实例得到每个学生的一些信息,包括姓名,成绩等。考试结束后才能得到结果,因此在实例化时不会对其赋值。

  班级学生:

  def __init__(self,name):

  self.name=name

  self.score=无

  迈克=学生(迈克)

  考试结束后,准备给迈克打分:

  迈克。分数=999

  在这里,老师不小心多打了一个9。总的来说分数是100分。999是非法数据,不应成功分配。学生多了,老师评分的错误肯定会越来越多,所以一定要想办法修改程序,把分值限制在0-100。

  

前言

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

  def set_score(self,new_score):

  如果不是isinstance(new_score,int):

  提升值错误(“分数必须是整数”)

  if 0=new_score=100:

  self.score=新分数

  返回自我得分

  else:

  提高值错误(“分数无效”)

  这样我们每次需要得到分数的时候就用self.score来得到分数,修改分数的时候调用函数来修改:

  mike.set_score(999)

  Call将来会报错,因为999是非法数据。注意这个时候我还是可以用self.score来设置,不报错:

  自我得分=999

  这显然是不可能的。所以要提供一个机制,让score成为私有属性,外部无法访问。可惜python的私有属性是伪私有的。我们通常把_ private开头的属性叫做,但这只是一种约定和规定。如果你在下划线的开头看到属性,不要访问它。如果你坚持要访问,可以,但是python不会禁止。

  

限制值

  虽然上述方法实现了函数,但它改变了属性的用法。通常是这样用的:

  #获取属性

  a=麦克. score

  #设置属性

  迈克。得分=99

  @属性

  定义分数(自我):

  回归自我。_分数

  @score.setter

  def分数(self,new_score):

  如果不是isinstance(new_score,int):

  提升值错误(“分数必须是整数”)

  if 0=new_score=100:

  自我。_score=new_score

  回归自我。_分数

  else:

  提高值错误(“分数无效”)

  

使用 @property 的方式代替。

  属性的好处

  

  • 统一了调用方式。self.score = 99 的方式,而不是函数调用的方式。
  • _score 我们就不直接去使用了。你要用也可以,不建议。
  • 如果我们一个属性只可以读,把 setter 部分注释掉就可以了。

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

  

from datetime import datetime

  class Student:

   def __init__(self, name, birth=1920):

   self.name = name

   self._score = None

   self.birth = birth

   self.age = datetime.now().year - self.birth

  mike = Student(mike)

  print(mike.birth)

  print(mike.age)

  

  • birth 和 age 这两个是可以根据一个求出另外一个的。存在数据冗余问题。

      

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

      

    self.age = datetime.now().second

      mike = Student(mike)

      time.sleep(5)

      print(mike.age)

      print(datetime.now().second)

  

  

动态显示

  

@property

  def age(self):

   return datetime.now().year - self.birth

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

  @property 作用和应用场景:

  

  • @property 优化了属性读取和设置的可读性
  • 需要限制属性的特征;
  • 只读属性。如果属性只可以读,不可以写,用起来很方便。
  • 这个属性根据一个变化的环境动态改变。

  

  

附:用property代替getter和setter方法

  

>>>class Watermelon():

         def __init__(self,price):

             self._price = price                  #私有属性,外部无法修改和访问

         def get_price(self):

             return self._price

         def set_price(self,new_price):

             if new_price > 0:

                 self._price = new_price

             else:

                 raise error:价格必须大于零

  用property代替getter和setter

  

>>>class Watermelon():

   def __init__(self,price):

   self._price = price

   @property #使用@property装饰price方法

   def price(self):

   return self._price

   @price.setter #使用@property装饰方法,当对price赋值时,调用装饰方法

   def price(self,new_price):

   if new_price > 0:

   self._price = new_price

   else:

   raise error:价格必须大于零

  >>> watermelon = Watermelon(4)

  >>>

  >>> watermelon.price

  4

  >>>

  >>> watermelon.price = 7

  >>>

  >>> watermelon.price

  7

  

  

  

总结

  到此这篇关于Python中property属性用处的文章就介绍到这了,更多相关Python中property属性内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

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

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