实例解说Python编制程序中@property装饰器的用法

日期: 2019-12-14 02:09 浏览次数 :

取值和赋值

既往,Python程序猿阿丽丝要思虑制造三个象征金钱的类。她的率先个完结格局轮廓是底下那样:

class Actress():
  def __init__(self):
    self.name = 'TianXin'
    self.age = 5

#以欧元为底工货币的Money类的第一个版本

类Actress中有八个成员变量name和age。在外界对类的积极分子变量的操作,重要包罗取值和赋值。简单的取值操作是x=object.var,轻便的赋值操作是object.var=value。

class Money:

>>> actress = Actress()
>>> actress.name  #取值操作
'TianXin'
>>> actress.age    #取值操作
20
>>> actress.name = 'NoName'   #赋值操作
>>> actress.name
'NoName'

    def __init__(self, dollars, cents):

使用 Getter 和 Setter 上述轻巧的取值和赋值操作,在好几景况下是不能够满意供给的。比方,要是要约束Actress的年华限定,那么只行使上述轻易的赋值操作就不可能满意须要了。getter和setter落成如此的渴求。

        self.dollars = dollars

class Actress():
  def __init__(self):
    self._name = 'TianXin'
    self._age = 20

  def getAge(self):
    return self._age

  def setAge(self, age):
    if age > 30:
      raise ValueError
    self._age = age

        self.cents = cents

调用setAge函数能够兑现将变量_age的取值范围节制到低于30.

实例解说Python编制程序中@property装饰器的用法。        #还会有其余部分方法,大家不常不用理会

>>> actress = Actress()
>>> actress.setAge(28)
>>> actress.getAge()
28
>>> actress.setAge(35)
ValueError

使用property property的概念是:
当中,fget是取值函数,fset是赋值函数,fdel是删除函数。使用property也兑现上述对成员变量的取值约束。

        多少个月或然几年之后。Alice想要重构Money类的内部贯彻,不再记录韩元和美分,而是独有记录美分,因为这样做能够让有个别操作简便超多。下边是她很可能会作的改造:

class Actress():
  def __init__(self):
    self._name = 'TianXin'
    self._age = 20

  def getAge(self):
    return self._age

  def setAge(self, age):
    if age > 30:
      raise ValueError
    self._age = age 

  age=property(getAge, setAge, None, 'age property')

#Money类的第一个版本

通过地方的概念后,可以像轻巧取值和赋值操作雷同操作age。例如,

class Money:

>>> actress = Actress()
>>> actress.age
20
>>> actress.age = 18
>>> actress.age = 55

ValueError

    def __init__(self, dollars, cents):

使用@property 使用@property相像可以兑现上述类的概念。

        self.total_cents = dollars * 100 + cents

class Actress():
  def __init__(self):
    self._name = 'TianXin'
    self._age = 20

  @property
  def age(self):
    return self._age

  @age.setter
  def age(self, age):
    if age > 30:
      raise ValueError
    self._age = age

选取时的演示:

        幸运的是,Iris知道黄金时代种越来越好的消释办法,能够制止那个令人胸口痛的局面现身:使用Python内建的property装饰器。@property诚如接纳在Python方法上,能够使得地将属性访谈(attribute access)变成方法调用(method call)。举例,临时将Money类抛至五头,尽管有二个表示人类的Person类(class):

>>> actress = Actress()
>>> actress.age
20
>>> actress.age = 18
>>> actress.age = 45
ValueError

class Person:

Python2 和 Python3中使用property的区别 上述property示例在Python3的景况下有效。在Python第22中学,使用property时,类定义时索要世袭object。不然,property的赋值操作不可接受。

    def __init__(self, first, last):        self.first = first

Python2下property的不错利用办法:

        self.last = last

class Actress(object):      #差别在这里
  def __init__(self):
    self._name = 'TianXin'
    self._age = 20

  @property
  def age(self):
    return self._age

  @age.setter
  def age(self, age):
    if age > 30:
      raise ValueError
    self._age = age 

  def setName(self, name):
    self._name = name

  def getName(self):
    return self._name

  def delName(self):
    print('Goodbye...')
    del self._name

  name = property(getName, setName, delName, 'name property'

)

    @property

实例:急速张开代码重构 在这里早前,Python技士Alice要绸缪成立一个象征金钱的类。她的率先个达成形式轮廓是底下那样:

    def full_name(self):

# 以美元为基础货币的Money类的首个版本
class Money:
  def __init__(self, dollars, cents):
    self.dollars = dollars
    self.cents = cents
    # 还有其他一些方法,我们暂时不必理会

        return '{} {}'.format(self.first, self.last)

那一个类新兴被打包到七个Python库里,况且日益地被超多例外的利用使用。举例,另二个团体中的Python程序猿Bob是那般使用Money类的:

        请注意full_name方法。除了在def语句上方装饰了@property之外,该方法的注明未有怎么两样的地点。可是,那却退换了Person对象的运行形式

money = Money(27, 12)
message = "I have {:d} dollars and {:d} cents."
print(message.format(money.dollars, money.cents))
# "I have 27 dollars and 12 cents."
money.dollars += 2
money.cents += 20
print(message.format(money.dollars, money.cents))
# "I have 29 dollars and 32 cents."

>>> buddy = Person('Jonathan', 'Doe')