@property有什么用呢?表面看来,就是将一个方法用属性的方式来訪问.
上代码,代码最清晰了.
class Circle(object): def __init__(self, radius): self.radius = radius @property def area(self): return 3.14 * self.radius ** 2 c = Circle(4) print c.radius print c.area
能够看到,area尽管是定义成一个方法的形式,可是加上@property后,能够直接c.area,当成属性訪问.
如今问题来了,(不是挖掘机技术哪家强),每次调用c.area,都会计算一次,太浪费cpu了,如何才干仅仅计算一次呢?这就是lazy property.
class lazy(object): def __init__(self, func): self.func = func def __get__(self, instance, cls): val = self.func(instance) setattr(instance, self.func.__name__, val) return val class Circle(object): def __init__(self, radius): self.radius = radius @lazy def area(self): print 'evalute' return 3.14 * self.radius ** 2 c = Circle(4) print c.radius print c.area print c.area print c.area能够看到,'evalute'仅仅输出了一次.假设看了我前面几篇博文,对@lazy的机制应该非常好理解.
在这里,lazy类有__get__方法,说明是个描写叙述器,第一次运行c.area的时候,由于顺序问题,先去c.__dict__中找,没找到,就去类空间找,在类Circle中,有area()方法,于是就被__get__拦截.
在__get__中,调用实例的area()方法算出结果,并动态给实例加入个同名属性把结果赋给它,即加到c.__dict__中去.
再次运行c.area的时候,先去c.__dict__找,由于此时已经有了,就不会经过area()方法和__get__了.