シングルトンは内部状態を保持することでそれを行います。ここでのこの状態は、おそらくクラスのインスタンスです。デコレータは任意のものにすることができます。
これを見てください:
http://hairysun.com/downloads/DecoratorHandout.pdf
class Decorator(object):
# in __init__ set up state
def __call__(self, function):
@functools.wraps(function)
def wrapper(*args, **kw): # 1.
print "before func"
result = function(*args, **kw) # 2.
print "after func"
return result
return wrapper # 3.
>>> decorator2 = Decorator()
>>> @decorator2
... def nothing(): pass
デコレータは基本的に、
- 関数を定義します
- それはあなたが渡した関数を呼び出します
- 後で呼び出されるように、新しく「ラップされた」関数を返します
周囲のクラス (ここではデコレーター) は、次のようなことを行うことができます。
class Singleton(object):
def __init__(self):
self.instance = None
def __call__(self, function):
@functools.wraps(function)
def wrapper(*args, **kw):
if self.instance is None:
self.instance = function(*args, **kw)
return self.instance
return wrapper
私はコードを実行しませんでしたが、これが一般的な仕組みだと思います。使用可能なインスタンスがない場合は作成します。利用可能な場合は、新しいものを作成しないでください。代わりに、古いものを 1 つ返します。これを本番環境で使用する前に、callable の他のプロパティを確認する必要があるかもしれません。