キャッシュが関数オブジェクトとその引数に基づいているキャッシングツールのテストを設定しようとしています。このテストを行うには、自分のプロパティで呼び出されている関数にアクセスする必要があります。これを行う方法を理解できません。子クラスから親クラスのプロパティゲッターにアクセスする
キャッシュコードは次のようになります。
def cached(func):
"""
Decorator to cache function calls
"""
@wraps(func)
def wrapper(self, *args):
# The cache lives in the instance so that it gets garbage collected
if (func, args) not in self._cache:
self._cache[(func, args)] = func(self, *args)
return self._cache[(func, args)]
return wrapper
と私はキャッシュされたプロパティを持っている:
class SpatialMixin(object):
@property
@cached
def longitude_extrema(self):
return 25
クラスは、このようなものになります。私がアクセスできる
class MainClass(SomeOtherBaseClass,SpatialMixin):
pass
MyObject = MainClass()
をbase_class.SpatialMixin.longitude_extrema.fget
直接、これは別のオブジェクトですMyObject.longitude_extrema.fget
(これは私ですそのプロパティのゲッタを示すために使用します。 MyObject.longitude_extrema
は25番なので、この方法でアクセスすることはできません)。
したがって、MyObject.longitude_extrema
プロパティの基礎となる関数にはどのようにアクセスできますか?
「SpatialMixin.longitude_extrema.fget」は間違ったゲッターであると思いますか? – user2357112
キャッシュラッパーがラッピングしている関数にアクセスしようとしている場合、それはゲッターではありません。キャッシュラッパーはゲッターです。ラップされた関数をラッパーなどの属性として使用できるようにすることができます。 – user2357112
私はコマンドラインからチェックし、キャッシュキーの関数の 'id'は' SpatialMixin.longitude_extrema.fget'とは異なります。しかし、getter(つまり、関数 'longitude_extrema')がラップされた関数ではない場合は...何ですか? – keflavich