Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用函数的单例实现_Python_Optimization_Design Patterns_Singleton - Fatal编程技术网

Python 使用函数的单例实现

Python 使用函数的单例实现,python,optimization,design-patterns,singleton,Python,Optimization,Design Patterns,Singleton,我在这本书中读到了创建单例函数的多种方法 我想出了另一种方法 def my_singleton(): if not my_singleton.instance: class MyClass: pass my_singleton.instance = MyClass() return my_singleton.instance my_singleton.instance = None 与前一个SO问题中提到的其他方法

我在这本书中读到了创建单例函数的多种方法

我想出了另一种方法

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/线程安全性/生命周期相关的任何含义。我这样问是因为其他方法对于初学者来说相当复杂(元类、装饰器、基类、装饰器返回类)

除了实例属性(
AttributeError:'function'对象没有属性“instance”
)之外,这种方法还有另一个问题。使用
my_singleton
创建“几乎是单例”对象后,您可以简单地从该对象获取类,并创建该类的新对象

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()
函数的(虽然没有引发属性错误,但它仍然不是真正的singleton):


我不确定函数方法,但确定您的代码无法生成
AttributeError:“function”对象没有属性“instance”
为什么需要单例?只要把东西放在需要的地方就行了。您需要为
my_singleton.instance
设置初始值。除此之外,您只是手动缓存一个值。没问题。谢谢。我错过了最后一行。编辑代码。啊,收到了,谢谢。它与decorator方法有着相同的问题,并且没有创建一个纯粹的单例对象。尽管我想不出程序员会使用这种方法(有意地)创建实例的用例。是否存在与实例的内存/GC/线程安全性/生命周期相关的任何含义?您可以在类级别通过MyClass.inst=None来堵塞该漏洞,并在_init_uuu中将self分配给它,如果已经分配了,则抛出异常。
def my_singleton():
    try:
        return my_singleton.instance
    except AttributeError:
        class MyClass:
            pass
        my_singleton.instance = MyClass()
        return my_singleton.instance