代码如下:
# -*- coding:gb2312 -*-
class Dog(object):
__instance = None
__init_flag = False
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
def __init__(self,name):
#self.name = name
if self.__init_flag == False:
#__init_flag = True
self.name = name
__init_flag = True
a = Dog("旺财")
print(id(a))
print(a.name)
b = Dog("哮天犬")
print(id(b))
print(b.name)
执行结果:
我的问题:
按照我的想法,我的这段代码当中写的是,设计了一个Dog的类,然后创建一个单例对象(第一个红色方框中的代码),也就是说,最终的实例a和b实际上是同一个东西。
然后我又把这个单例对象设置了,只初始化一次(见第二个红色方框中的代码),换句话说,a这个实例创建了之后,名字叫旺财,那么b这个实例创建之后,应该不会初始化,那么哮天犬这个名字应该不可能打印出来。按照我的想法,应该打印的结果是两个旺财。为什么现在结果跟我设想的不太一样?
其实你已经实现了单例对象了, 从
id
的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__
里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__
初始化动作啊, 而且你修改的__init_flag = True
只是在实例对象
里面而已, 并没有修改到类
那边, 所以你的判断在无效的, 只有修改到类
那边的__init_flag
才有效, 所以代码修正为:另外有两个小建议:
判断对象是否None时, 不要用
==
, 应该用is
:cls.__instance is None
判断是否等于
false
, 也不要用==
, 应该是not
:if not self.__init_flag