【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. debian - docker依赖的aufs-tools源码哪里可以找到啊?2. java基础,求解答。3. 如何调整IDEA中直接运行java程序的日志输出级别?4. css - 关于input标签disabled问题5. css3中translate(-50%,-50%)对 transform-origin的奇葩影响?6. java - 为什么要将Runnable接口的子类对象传递给Thread的构造函数?7. docker api 开发的端口怎么获取?8. javascript - vue 数据更新了。但是dom没有更新,,,,,如图9. html5 - 百度Ueditor代码高亮和代码段滚动条冲突是怎么回事?10. javascript - 静态页面引公共头尾文件,js怎么写吖?