Kod adalah seperti berikut:
# -*- 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)
Hasil pelaksanaan:
Soalan saya:
Mengikut idea saya, apa yang saya tulis dalam kod ini adalah untuk mereka bentuk kelas Anjing dan kemudian mencipta objek tunggal (kod dalam kotak merah pertama), iaitu, akhirnya Contoh a dan b sebenarnya adalah perkara yang sama.
Kemudian saya menyediakan objek tunggal ini dan memulakannya sekali sahaja (lihat kod dalam kotak merah kedua, dengan kata lain, selepas contoh a dicipta, namanya Wangcai, kemudian selepas contoh b dicipta, , ia). tidak harus dimulakan, jadi mustahil untuk mencetak nama Roaring Sky Dog. Menurut idea saya, hasil yang sepatutnya dicetak ialah dua kekayaan yang makmur. Mengapa keputusan sekarang berbeza daripada apa yang saya jangkakan?
Malah, anda telah pun melaksanakan objek tunggal, dan ia hanya sah dari
id
的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__
里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__
初始化动作啊, 而且你修改的__init_flag = True
只是在实例对象
里面而已, 并没有修改到类
那边, 所以你的判断在无效的, 只有修改到类
那边的__init_flag
, jadi kod itu disemak semula kepada:Dua lagi cadangan:
Apabila menilai sama ada objek itu Tiada, jangan gunakan
==
, 应该用is
:cls.__instance is None
Nilai sama ada ia sama dengan
false
, 也不要用==
, 应该是not
:if not self.__init_flag