【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. javascript - 如何用最快的速度C#或Python开发一个桌面应用程序来访问我的网站?2. java - springMVC配置的controller无法返回jsp文件3. javascript - weex和node,js到底是怎样一个关系呢?4. javascript - 项目用IE浏览器打开修改前端内容,后台数据修改了,但是前端页面内容不变,用谷歌浏览器测试前端页面可以刷新,求大神解决。5. mysql 存储过程 和 函数有什么用??6. python - 关于beautifulsoup获取文档内容7. android的checkbox在xml添加和在java代码中添加样式不一样?8. javascript - 看一些高手写代码单独用 “$”和“_” 来表示变量,什么时候单独使用这两个字符?9. 前端 - 使用vue2服务端渲染的时候,如何在服务端请求数据,然后给vue渲染10. mysql - jdbc的问题
