Python クラス属性の遅延評価

高洛峰
高洛峰オリジナル
2016-11-22 14:29:161303ブラウズ

いわゆるクラス属性の遅延計算とは、クラスの属性をプロパティとして定義し、アクセスされたときのみ計算され、一度アクセスされると結果がキャッシュされ、毎回計算する必要がありません。

利点

遅延計算プロパティを構築する主な目的は、パフォーマンスを向上させることです

実装

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 によるもので、一度呼び出される限り、その後何回呼び出してもカウントされません。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。