下面是python中单例的例子。我不理解的一件事是,我认为类中的_instance总是设置为None,因此"if not cls._instance“应该始终为真,因此,没有必要使用if语句。
我知道我错了,请帮帮我。
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没有被触发?而它是在第一次调用时触发的?
发布于 2018-06-04 03:25:07
__new__
也是一个类方法,它取代了__init__
方法(您可以控制在此级别创建的对象)
_instance
是类属性,而不是实例属性。因此,在创建实例之前,它在__new__
方法中是可见的/可用的。
第一次,cls._instance
参数是None
,所以__new__
创建实例并将结果存储在cls
的_instance
类属性中(这是您的Singleton
类)
第二次不是None
,因为实例的引用已经存储为,所以它返回相同的self._instance
对象。在这个过程中,object.__new__
在类的生命周期内只被调用一次。
这遵循单例的设计模式:创建一次,每次返回相同的对象。
注意,这是不正确的:
cls._instance = object.__name__(cls, *args, **kwargs)
应该是
cls._instance = object.__new__(cls, *args, **kwargs)
调用object.__name__
没有任何意义,因为它是一个字符串。从您的代码派生而来的小型自包含示例:
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)
此代码输出:
creating
True
如你所见,它第一次创建对象,然后第二次创建对象时返回相同的对象。
发布于 2018-06-04 03:20:08
如果cls._instance
为None
,则not cls._instance
为True
,而不是False
。
https://stackoverflow.com/questions/50670103
复制相似问题