好的,在痛苦的细节中仔细研究一下:
class Singleton:隐式继承自Object,因为在python中,一切都是Object.
instance = None仅在模块加载时读取,并且将类级别变量实例设置为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时都会完成此测试.由于在第一次创建Singleton时设置了cls.instance,因此super().__ new __(cls)也只被调用一次. Singleton的超类是Object.因此,super().__ new __(cls)的行为正是您所期望的任何其他类的行为.
如果,您正在创建Singleton的第二个(或第三个/第四个/第五个……)实例,则不会调用此super().__ new __(cls).而是返回类级别变量实例,这意味着不能创建Singleton的新实例.
当您打印Singleton的实例时,您可以看到0x10dbc0f60的内存地址对于两个“实例”都是相同的,因为cls.instance在__new__时间返回,您可以将其视为内存分配时间,然后调用__init__.
这是一个执行Singleton模式的好方法,因为为了创建一个单例类,现在,您所要做的就是继承Singleton并且已经完成了繁重的工作.你继续像往常一样使用__init__,不要担心.每次你去创建该类的“新”实例时,你都会得到相同的实例.完全在幕后.
这是非常先进的东西,但看起来有多简单. python是最棒的!