码迷,mamicode.com
首页 > 编程语言 > 详细

Python 进阶 之 @property

时间:2017-11-25 13:17:40      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:成员函数   返回   back   rac   one   pytho   trace   调用   return   

@property是一个装饰器,由Python原生库所支持,无需import

@property 的作用是将函数变成属性,一般作用于类内的成员函数。

先贴个代码来描述一下@poperty存在的意义:

>>> class Money(object):
...     def money(self):
...         return self.private_money
... 
>>> a = Money()
>>> a.money()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in money
AttributeError: Money object has no attribute private_money
>>> a.private_money = 1000
>>> a.money()
1000
>>> a.private_money = 10000
>>> a.money()
10000

我们声明了一个类Money,该类有个money函数用来返回类实例的私有money。

这个类正常使用没有什么问题,但有个隐患就是在调用money函数前是不知道类实例的当前私有money的值的,因为money的值实在太容易发生变化了,没有任何限制。做个惶恐的假设,这个money如果指的是老板发给员工的工资,老板岂不是要亏死了。。

我们对该类做个改进,限制一下money的值

>>> class Money(object):
...     def money(self):
...         if self.test_money > 2000 or self.test_money < 1000:
...             raise ValueError
...         else:
...             return self.test_money
... 
>>> a = Money()
>>> a.test_money = 1000
>>> a.money()
1000
>>> a.test_money = 10000
>>> a.money()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in money
ValueError

现在能够限制Money的自由变化了,但是对于money的赋值和取值似乎有点麻烦了(赋值:a.test_money = 1000, 取值a.money),有没有一种方法既能实现变量值的限制,又能简化值的调用呢, 请看代码:

>>> class Money(object):
...     @property
...     def money(self):
...         if self.test_money > 2000 or self.test_money < 1000:
...             raise ValueError
...         else:
...             return self.test_money
... 
>>> a = Money()
>>> a.test_money = 1000
>>> a.money()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int object is not callable
>>> a.money
1000

可以看到,@property已经将money函数变成了一个属性,在调用a.money()时会发生error,调用a.money时即可正常。似乎还是有点麻烦,私有money的赋值还是有点麻烦,根据鸭子定则,如何能把money函数真正变成一个“属性呢”,看下述代码:

>>> a.money
1000
>>> class Money(object):
...     @property
...     def money(self):
...         if self.test_money > 2000 or self.test_money < 1000:
...             raise ValueError
...         else:
...             return self.test_money
...     @money.setter
...     def money(self, value):
...         self.test_money = value
... 
>>> a = Money()
>>> a.money = 1000
>>> a.money
1000

money.setter重写了money属性的写权限,money.getter 可重写money属性的读权限,在此不再赘述

Python 进阶 之 @property

标签:成员函数   返回   back   rac   one   pytho   trace   调用   return   

原文地址:http://www.cnblogs.com/JansXin/p/7894777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!