2

次のコード スニペットがどのように機能するかについて混乱していますか? これはデコレーターであり、プロパティを遅延して初期化し、次のリクエストでキャッシュされたプロパティを使用します。コードを見ると、常に self.method を呼び出すように見えますか? 少しの説明が役に立ちます

class cached_property(object):
    def __init__(self, method, name=None):
        self.method = method
        self.name = name or method.__name__
        self.__doc__ = method.__doc__
    def __get__(self, inst, cls):
        if inst is None:
            return self
        result = self.method(inst)
        setattr(inst, self.name, result)
        return result
4

1 に答える 1

2

私には、初めてメソッドを呼び出すように見えますresult = self.method(inst)。次に、インスタンスのメソッドを結果に置き換えます: setattr(inst,self.name,result).

その後のmy_instance.my_cached_propertyでは、記述子ではなく、メソッドの (初期) 結果 (通常の属性として) に実際にアクセスしています (その属性を上書きしたため、元のメソッドと記述子クラスはクラスにバインドされていません)。

于 2012-10-15T14:05:34.080 に答える