您的位置:首页技术文章
文章详情页

【python小白】 问关于之初始化一次对象的问题

【字号: 日期:2022-06-27 14:49:22浏览:44作者:猪猪

问题描述

代码如下:

# -*- 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)

执行结果:

【python小白】 问关于之初始化一次对象的问题

我的问题:

【python小白】 问关于之初始化一次对象的问题按照我的想法,我的这段代码当中写的是,设计了一个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

标签: Python 编程
相关文章: