首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python单例代码

python单例代码
EN

Stack Overflow用户
提问于 2018-06-04 03:17:41
回答 2查看 341关注 0票数 0

下面是python中单例的例子。我不理解的一件事是,我认为类中的_instance总是设置为None,因此"if not cls._instance“应该始终为真,因此,没有必要使用if语句。

我知道我错了,请帮帮我。

代码语言:javascript
复制
class Singleton(object):
    _instance = None  # Keep instance reference 
    # why do this???? If do this, the "if not .." state follow is always true, right? 
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__name__(cls, *args, **kwargs)
        return cls._instance

更新

我的困惑是:为什么第二次调用Singleton()时,_instance = None没有被触发?而它是在第一次调用时触发的?

EN

回答 2

Stack Overflow用户

发布于 2018-06-04 03:25:07

__new__也是一个类方法,它取代了__init__方法(您可以控制在此级别创建的对象)

_instance是类属性,而不是实例属性。因此,在创建实例之前,它在__new__方法中是可见的/可用的。

第一次,cls._instance参数是None,所以__new__创建实例并将结果存储在cls_instance类属性中(这是您的Singleton类)

第二次不是None,因为实例的引用已经存储为,所以它返回相同的self._instance对象。在这个过程中,object.__new__在类的生命周期内只被调用一次。

这遵循单例的设计模式:创建一次,每次返回相同的对象。

注意,这是不正确的:

代码语言:javascript
复制
cls._instance = object.__name__(cls, *args, **kwargs)

应该是

代码语言:javascript
复制
cls._instance = object.__new__(cls, *args, **kwargs)

调用object.__name__没有任何意义,因为它是一个字符串。从您的代码派生而来的小型自包含示例:

代码语言:javascript
复制
class Singleton(object):
    _instance = None  # Keep instance reference
    # why do this???? If do this, the if state follow is always false, right?
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls, *args, **kwargs)
            print("creating")
        return cls._instance

a = Singleton()
b = Singleton()
print(a is b)

此代码输出:

代码语言:javascript
复制
creating
True

如你所见,它第一次创建对象,然后第二次创建对象时返回相同的对象。

票数 4
EN

Stack Overflow用户

发布于 2018-06-04 03:20:08

如果cls._instanceNone,则not cls._instanceTrue,而不是False

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

https://stackoverflow.com/questions/50670103

复制
相关文章

相似问题

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