Python黑魔法之财产装饰器的示例

  介绍

这篇文章主要介绍了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 

Python黑魔法之财产装饰器的示例