我正在尝试使用装饰器来实现Singleton设计模式。使用元类可以很容易地实现它,但是我面临的问题是一个类可以具有多个模式。
例如,一个类可以是观察者,也可以是单身人士。我的装饰器看起来像这样:
def Singleton(_cls):
_instances = {}
def wrapper(*args, **kwargs):
if _cls not in _instances:
_instances[_cls] = object.__new__(_cls)
_instances[_cls].__dict__.update(kwargs)
else:
raise AlreadyDefinedError(
"A Singleton instance has been defined already. "
"You can't have more than 1 Singleton object."
)
return _instances[_cls]
return wrapper
问题在于,由于Singleton
是一个函数,因此此代码不起作用。每次装饰新类时,我的_instances
dict
都会重新定义,并且为空。有什么办法可以解决这个问题?
答案 0 :(得分:1)
您尚未在字典中更新*args
。
有很多方法可以做一个单例装饰器。这是一种函数属性方法。
import functools as ft
def singleton(cls):
@ft.wraps(cls)
def wrapper(*args, **kwargs):
if wrapper.instance is None:
wrapper.instance = cls(*args, **kwargs)
return wrapper.instance
wrapper.instance = None
return wrapper