所谓类属性的延迟计较就是将类的属性界说成一个property,只在会见的时候才管帐算,并且一旦被会见后,功效将会被缓存起来,不消每次都计较。结构一个延迟计较属性的主要目标是为了晋升机能
property
在切入正题之前,我们相识下property的用法,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 LazyProperty(object): def __init__(self, func): self.func = func def __get__(self, instance, owner): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return value import math class Circle(object): def __init__(self, radius): self.radius = radius @LazyProperty def area(self): print 'Computing area' return math.pi * self.radius ** 2 @LazyProperty def perimeter(self): print 'Computing perimeter' return 2 * math.pi * self.radius
说明
界说了一个延迟计较的装饰器类LazyProperty。Circle是用于测试的类,Circle类有是三个属性半径(radius)、面积(area)、周长(perimeter)。面积和周长的属性被LazyProperty装饰,下面来试试LazyProperty的邪术:
>>> c = Circle(2) >>> print c.area Computing area 12.5663706144 >>> print c.area 12.5663706144
在area()中每计较一次就会打印一次“Computing area”,而持续挪用两次c.area后“Computing area”只被打印了一次。这得益于LazyProperty,只要挪用一次后,无论后续挪用几多次都不会反复计较。