class Singleton:
instance = None
def __new__(cls):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
singleton_obj1 = Singleton()
singleton_obj2 = Singleton()
print(singleton_obj1)
print(singleton_obj2)
输出
<__main__.Singleton object at 0x10dbc0f60>
<__main__.Singleton object at 0x10dbc0f60>
有人能解释一下这条线到底发生了什么吗,cls.instance = super().__new__(cls)
。哪几行代码有助于使该类成为Singleton
发布于 2018-06-12 04:30:00
好的,让我们痛苦地回顾一下这一点:
class Singleton:
隐式继承自Object
,因为在python中,一切都是对象。
instance = None
仅在模块加载时读取,并将类级变量instance
设置为None
一次,但它可以被类Singleton
的各个实例覆盖。
def __new__(cls):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
(首先,我认为他们把"cls“放在里面很奇怪,我知道他们为什么这么做,因为它指的是整个类,而不是那个类的具体实例。但是,这可能会让人感到困惑,因为有些人不知道自己在看什么。无论如何...)
__new__
是在__init__
之前调用的一个神奇函数,它大致类似于为类的新实例分配空间。在这里,cls.instance
在模块加载时被设置为None
,因此每次创建新的Singleton
时都会执行此测试。由于cls.instance
是在第一次创建Singleton
时设置的,因此super().__new__(cls)
也只调用一次。Object
是Singleton
的超类。因此,super().__new__(cls)
的行为与您所创建的任何其他类的行为完全相同。
如果,您正在创建第二个(或第三个/第四个/第五个...)实例,则不会调用此super().__new__(cls)
。相反,将返回类级别变量instance
,这意味着不能创建Singleton
的新实例。
当您打印Singleton
的实例时,您可以看到两个“实例”的0x10dbc0f60
的内存地址是相同的,因为cls.instance
是在__new__
时间返回的,您可以将其视为__init__
被调用之前的内存分配时间。
这是一个创建单例模式的好方法,因为为了创建一个单例类,现在,您所要做的就是继承Singleton
,并且繁重的工作已经完成。您可以像往常一样使用__init__
,不用担心。每次创建该类的“新”实例时,都会得到相同的实例。完全在幕后。
这是非常高级的东西,但看看它是多么简单。python是最好的!
发布于 2018-06-12 03:36:34
构造器说,
If there is no instance recorded,
create an instance and record it
return the recorded instance
对于大多数语言,这是一个标准的单例设计模式,以确保只创建类的一个实例。
https://stackoverflow.com/questions/50804826
复制相似问题