[Python-Neuling] Stellen Sie eine Frage zur einmaligen Initialisierung eines Objekts
我想大声告诉你
我想大声告诉你 2017-06-28 09:24:24
0
1
658

Der Code lautet wie folgt:

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

Ausführungsergebnis:

Meine Frage:


Nach meiner Idee besteht das, was ich in diesem Code geschrieben habe, darin, eine Dog-Klasse zu entwerfen und dann ein Singleton-Objekt (den Code im ersten roten Feld) zu erstellen, also letztendlich die Instanzen von a und b sind eigentlich dasselbe.
Dann habe ich dieses Singleton-Objekt eingerichtet und es nur einmal initialisiert (siehe den Code im zweiten roten Feld). Mit anderen Worten, nachdem die Instanz a erstellt wurde, lautet ihr Name Wangcai, und nachdem die Instanz b erstellt wurde, heißt sie sollte nicht initialisiert werden, daher sollte es unmöglich sein, den Namen Roaring Sky Dog auszudrucken. Nach meiner Vorstellung sind das Ergebnis, das gedruckt werden sollte, zwei wohlhabende Reichtümer. Warum ist das Ergebnis jetzt anders als erwartet?

我想大声告诉你
我想大声告诉你

Antworte allen(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 = True
                self.name = name
                Dog.__init_flag = True   # 修改基类的__init_flag 

另外有两个小建议:

  1. 判断对象是否None时, 不要用==, 应该用is: cls.__instance is None

  2. 判断是否等于false, 也不要用==, 应该是not: if not self.__init_flag

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage