いわゆるクラス属性の遅延計算とは、クラスの属性をプロパティとして定義することであり、アクセスされたときにのみ計算され、アクセスされると結果はキャッシュされ、毎回計算する必要はありません。遅延計算プロパティを構築する主な目的は、パフォーマンスを向上させることです
プロパティ
本題に入る前に、プロパティの使用法を理解して、プロパティへのアクセスをメソッド呼び出しに変換します。
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 が呼び出されるたびに 1 回だけ計算されます。どうすれば 1 回だけ計算できるのでしょうか。これが遅延プロパティです
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 クラスには、半径、面積、周長の 3 つの属性があります。面積と周囲のプロパティは LazyProperty によって装飾されます。LazyProperty の魔法を試してみましょう:
>>> c = Circle(2) >>> print c.area Computing area 12.5663706144 >>> print c.area 12.5663706144
以上がPython のパフォーマンスを向上させるための遅延初期化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。