Python 进阶 之 @property
Posted Jansora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 进阶 之 @property相关的知识,希望对你有一定的参考价值。
@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的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情