VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python黑魔法之property装饰器详解(2)

可以看到,'evalute'只输出了一次,对@lazy的机制应该很好理解.

在这里,lazy类有__get__方法,说明是个描述器,第一次执行c.area的时候,因为顺序问题,先去c.__dict__中找,没找到,就去类空间找,在类Circle中,有area()方法,于是就被__get__拦截.

在__get__中,调用实例的area()方法算出结果,并动态给实例添加个同名属性把结果赋给它,即加到c.__dict__中去.

再次执行c.area的时候,先去c.__dict__找,因为此时已经有了,就不会经过area()方法和__get__了.

注意点

请注意以下代码场景:

代码片段1:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Parrot(object): 
  def __init__(self): 
    self._voltage = 100000
 
  @property
  def voltage(self): 
    """Get the current voltage."""
    return self._voltage 
 
if __name__ == "__main__"
  # instance 
  = Parrot() 
  # similarly invoke "getter" via @property 
  print p.voltage 
  # update, similarly invoke "setter" 
  p.voltage = 12

代码片段2:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Parrot: 
  def __init__(self): 
    self._voltage = 100000
 
  @property
  def voltage(self): 
    """Get the current voltage."""
    return self._voltage 
 
if __name__ == "__main__"
  # instance 
  = Parrot() 
  # similarly invoke "getter" via @property 
  print p.voltage 
  # update, similarly invoke "setter" 
  p.voltage = 12

相关教程