这篇文章主要介绍了Python黑魔法之财产装饰器的示例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
@ property装饰器能把一个方法变成属性一样来调用,下面我们就一起来看看Python黑魔法@ property装饰器的使用技巧解析
@ property有什么用呢?表面看来,就是将一个方法用属性的方式来访问。
上代码,代码最清晰了。
class 懒惰(对象):, def 才能;__init__(自我,,func):, ,,,self.func =, func ,, def 才能;__get__(自我,,,,cls):, ,,,val =, self.func(实例), ,,,setattr(例如,,self.func.__name__,, val), ,,,return val ,, class 圆(对象): def 才能__init__(自我,,半径):, ,,,self.radius =, radius ,, @lazy 才能; def 才能;区域(自我):, ,,,print & # 39;评定# 39;, ,,,return 3.14, *, self.radius * *, 2, ,, c =,圈(4), print c.radius print c.area print c.area print c.area
可以看的到,& # 39;评定# 39;只输出了一次,对@lazy的机制应该很好理解。
在这里,懒类有__get__方法,说明是个描述器,第一次执行c.area的时候,因为顺序问题,先去c.__dict__中找,没找的到,就去类空间找,在类中,有面积()方法,于是就被__get__拦截。
在__get__中,调用实例的区域()方法算出结果,并动态给实例添加个同名属性把结果赋给它,即加到c.__dict__中去。
再次执行c.area的时候,先去c.__dict__找,因为此时已经有了,就不会经过面积()方法和__get__了。
注意点
请注意以下代码场景:
代码片段1:,,
class 鹦鹉(对象):, def 才能__init__(自我):, ,,,self._voltage =, 100000, ,, @property 才能; def 才能;电压(自我):, ,,,“““Get 从而current 电压!”““, ,,,return self._voltage ,, if __name__ ==,“__main__":, #,才能instance p 才能=,鹦鹉(), #,才能similarly invoke “getter", via @property print 才能;p.voltage #,才能更新,similarly invoke “setter", p.voltage 才能=,
12代码片段2
class 鹦鹉:, def 才能__init__(自我):, ,,,self._voltage =, 100000, ,, @property 才能; def 才能;电压(自我):, ,,,“““Get 从而current 电压!”““, ,,,return self._voltage ,, if __name__ ==,“__main__":, #,才能instance p 才能=,鹦鹉(), #,才能similarly invoke “getter", via @property print 才能;p.voltage #,才能更新,similarly invoke “setter", p.voltage 才能=,12
<强>代码1、2的区别在于,强>
类鹦鹉(对象),
在python2下,分别运行测试,
片段1:将会提示一个预期的错误信息AttributeError:停下来# 39;t attribute
片段2:正确运行
参考python2文档,@ property将提供一个才能准备好属性,以上代码没有提供对应的@voltage.setter,按理说片段2代码将提示运行错误,在python2文档中,我们可以找到以下信息:
<强> BIF:, 强>
属性([fget [, fset [, fdel[,医生]]]]),
返回一个财产属性为新型类(类来自对象)只
原来在python2下,内置类型对象并不是默认的基类,如果在定义类时,没有明确说明的话(代码片段2),我们定义的鹦鹉(代码片段2)将不会继承
而对象类正好提供了我们需要的@ property功能,在文档中我们可以查到如下信息:新型class