首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解释python Singleton类

解释python Singleton类
EN

Stack Overflow用户
提问于 2018-06-12 03:32:20
回答 2查看 6K关注 0票数 7
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)也只调用一次。ObjectSingleton的超类。因此,super().__new__(cls)的行为与您所创建的任何其他类的行为完全相同。

如果,您正在创建第二个(或第三个/第四个/第五个...)实例,则不会调用此super().__new__(cls)。相反,将返回类级别变量instance,这意味着不能创建Singleton的新实例。

当您打印Singleton的实例时,您可以看到两个“实例”的0x10dbc0f60的内存地址是相同的,因为cls.instance是在__new__时间返回的,您可以将其视为__init__被调用之前的内存分配时间。

这是一个创建单例模式的好方法,因为为了创建一个单例类,现在,您所要做的就是继承Singleton,并且繁重的工作已经完成。您可以像往常一样使用__init__,不用担心。每次创建该类的“新”实例时,都会得到相同的实例。完全在幕后。

这是非常高级的东西,但看看它是多么简单。python是最好的!

票数 8
EN

Stack Overflow用户

发布于 2018-06-12 03:36:34

构造器说,

If there is no instance recorded, 
   create an instance and record it
return the recorded instance

对于大多数语言,这是一个标准的单例设计模式,以确保只创建类的一个实例。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50804826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档