いわゆるクラス属性の遅延計算とは、クラスの属性をプロパティとして定義し、アクセスされたときのみ計算され、一度アクセスされると結果がキャッシュされ、毎回計算する必要がありません。
利点
遅延計算プロパティを構築する主な目的は、パフォーマンスを向上させることです
実装
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 valueimport mathclass 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 クラスには、半径、面積、周長の 3 つの属性があります。面積と周囲のプロパティは LazyProperty によって装飾されます。LazyProperty の魔法を試してみましょう:
>>> c = Circle(2) >>> print c.area Computing area 12.5663706144 >>> print c.area 12.5663706144
「面積の計算」は area() で計算されるたびに出力され、c.area を 2 回連続して呼び出した後、「計算領域「を印刷します。」は 1 回だけ印刷されました。これは LazyProperty によるもので、一度呼び出される限り、その後何回呼び出してもカウントされません。