Le code est le suivant :
# -*- coding:gb2312 -*-
class Dog(object):
__instance = None
__init_flag = False
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
def __init__(self,name):
#self.name = name
if self.__init_flag == False:
#__init_flag = True
self.name = name
__init_flag = True
a = Dog("旺财")
print(id(a))
print(a.name)
b = Dog("哮天犬")
print(id(b))
print(b.name)
Résultat de l'exécution :
Ma question :
Selon mon idée, ce que j'ai écrit dans ce code est de concevoir une classe Dog puis de créer un objet singleton (le code dans la première case rouge), c'est-à-dire finalement les instances de a et b sont en fait la même chose.
Ensuite, j'ai configuré cet objet singleton et je ne l'ai initialisé qu'une seule fois (voir le code dans la deuxième case rouge. En d'autres termes, après la création de l'instance a, son nom est Wangcai, puis après la création de l'instance b, , elle). ne doit pas être initialisé, il devrait donc être impossible d'imprimer le nom Roaring Sky Dog. Selon mon idée, le résultat qui devrait être imprimé est deux richesses prospères. Pourquoi le résultat est-il maintenant différent de ce à quoi je m’attendais ?
En fait, vous avez déjà implémenté l'objet singleton, et il n'est valable qu'à partir de
id
的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__
里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__
初始化动作啊, 而且你修改的__init_flag = True
只是在实例对象
里面而已, 并没有修改到类
那边, 所以你的判断在无效的, 只有修改到类
那边的__init_flag
, donc le code est révisé comme :Deux autres suggestions :
Lorsque vous jugez si l'objet est Aucun, n'utilisez pas
==
, 应该用is
:cls.__instance is None
Jugez s'il est égal à
false
, 也不要用==
, 应该是not
:if not self.__init_flag