【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. objective-c - iOS开发支付宝和微信支付完成为什么跳转到了之前开发的一个app?2. 在mac下出现了两个docker环境3. docker images显示的镜像过多,狗眼被亮瞎了,怎么办?4. docker-compose 为何找不到配置文件?5. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!6. angular.js - angular内容过长展开收起效果7. PHP中的$this代表当前的类还是方法?8. macos - mac下docker如何设置代理9. dockerfile - [docker build image失败- npm install]10. java - 我用Tomcat访问SQL server数据库时,出现以下错误,该怎么解决?