【python小白】 问关于之初始化一次对象的问题
问题描述
代码如下:
# -*- coding:gb2312 -*-class Dog(object): __instance = None __init_flag = Falsedef __new__(cls,name):if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instanceelse: return cls.__instance def __init__(self,name):#self.name = nameif self.__init_flag == False: #__init_flag = True self.name = name __init_flag = Truea = Dog('旺财')print(id(a))print(a.name)b = Dog('哮天犬')print(id(b))print(b.name)
执行结果:

我的问题:
按照我的想法,我的这段代码当中写的是,设计了一个Dog的类,然后创建一个单例对象(第一个红色方框中的代码),也就是说,最终的实例a和b实际上是同一个东西。然后我又把这个单例对象设置了,只初始化一次(见第二个红色方框中的代码),换句话说,a这个实例创建了之后,名字叫旺财,那么b这个实例创建之后,应该不会初始化,那么哮天犬这个名字应该不可能打印出来。按照我的想法,应该打印的结果是两个旺财。为什么现在结果跟我设想的不太一样?
问题解答
回答1:其实你已经实现了单例对象了, 从id的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__初始化动作啊, 而且你修改的__init_flag = True只是在实例对象里面而已, 并没有修改到类那边, 所以你的判断在无效的, 只有修改到类那边的__init_flag才有效, 所以代码修正为:
class Dog(object): ....(其他内容请自行补充)... def __init__(self, name): # self.name = name if not self.__init_flag:# __init_flag = Trueself.name = nameDog.__init_flag = True # 修改基类的__init_flag
另外有两个小建议:
判断对象是否None时, 不要用==, 应该用is: cls.__instance is None
判断是否等于false, 也不要用==, 应该是not: if not self.__init_flag
相关文章:
1. java编程思想第4版中文版的几处谬误?2. java - 使用均值hash算法 生成图像指纹 多次调用 返回的信息居然不一致3. Java:Thread.currentThread()。sleep(x)与Thread.sleep(x)4. javascript - 求助这种功能有什么好点的插件?5. java - 请教一个spring定时任务的问题6. pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)7. 前端 - html5 audio不能播放8. Hbuilder中的phpMyAdmin访问题9. mysql sql where id in(25,12,87) 结果集如何用按照 25 12 87排序?10. java - Ckeditor上传图片时出现mutipartRequest 转换异常

网公网安备