使用功能的单例实现

时间:2018-06-26 10:41:57

标签: python optimization design-patterns singleton

我了解了在此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 /线程安全性/生命周期有关。我之所以这样问,是因为对于初学者而言,其他方法看起来相当复杂(元类,装饰器,基类,装饰器返回类)

1 个答案:

答案 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