我了解了在此SO question中创建单例函数的多种方法。
我想出了另一种方法
def my_singleton():
if not my_singleton.instance:
class MyClass:
pass
my_singleton.instance = MyClass()
return my_singleton.instance
my_singleton.instance = None
与上一个SO问题中提到的其他方法相比,这种方法有什么问题?是否与实例的内存/ GC /线程安全性/生命周期有关。我之所以这样问,是因为对于初学者而言,其他方法看起来相当复杂(元类,装饰器,基类,装饰器返回类)
答案 0 :(得分:2)
除了实例属性(AttributeError: 'function' object has no attribute 'instance'
)存在问题外,这种方法还有另一个问题。使用my_singleton
创建“几乎单个”对象后,您可以简单地从该对象获取类并创建该类的 new 对象。
x = my_singleton()
y = my_singleton()
x == y
Out[50]: True
z = x.__class__()
type(z) == type(x)
Out[52]: True
z == x
Out[53]: False
顺便说一句。这是我修复您的my_singleton()
函数的方式(不引起属性错误,但仍然不是真正的单例):
def my_singleton():
try:
return my_singleton.instance
except AttributeError:
class MyClass:
pass
my_singleton.instance = MyClass()
return my_singleton.instance