私はコンストラクタのmemoiziationを可能にするデコレータを書いてみたいです。私はクラスを構築するとき、私はオブジェクトが可能なときにキャッシュから返されます。この場合、isinstance()はなぜFalseを返しますか?
次のコードは、hereから変更されています。
from functools import wraps
def cachedClass(klass):
cache = {}
@wraps(klass, updated=())
class wrapper:
def __new__(cls, *args, **kwargs):
key = (cls,) + args + tuple(kwargs.items())
try:
inst = cache.get(key, None)
except TypeError:
# Can't cache this set of arguments
inst = key = None
if inst is None:
inst = klass.__new__(klass, *args, **kwargs)
inst.__init__(*args, **kwargs)
if key is not None:
cache[key] = inst
return inst
return wrapper
小さなテストスイートには、以下をrevals:
>>> @cachedClass
... class Foo:
... pass
>>> f1 = Foo()
>>> f2 = Foo()
>>> f1 is f2
True
>>> Foo
<class 'cache.Foo'>
>>> type(f1)
<class 'cache.Foo'>
>>> isinstance(f1, Foo)
False
私は最後の式はTrue
を返すだろうと期待しました。私は何が欠けていますか?
私はPython 2.7を使用していますが、私は 'True'を取得します。しかし、インタプリタは 'type(f1)'を実行すると ''を返します。 –
HFBrowning
@HFBrowning 'class Foo:pass'はPython 2の古いスタイルのクラスです。 – vaultah