コードは以下のように表示されます:
リーリー結果:
######私の質問:######
私のアイデアによれば、このコードで書いたのは、Dog クラスを設計し、シングルトン オブジェクト (最初の赤いボックスのコード) を作成することです。最後のインスタンス a と b は実際には同じものです。 次に、このシングルトン オブジェクトをセットアップし、一度だけ初期化しました (2 番目の赤いボックス内のコードを参照)。つまり、インスタンス a が作成された後の名前は Wangcai となり、インスタンス b が作成された後、インスタンス b になります。は初期化しないでください。そのため、Roaring Sky Dog という名前を出力することはできないはずです。私の考えによれば、印刷されるべき結果は 2 つの豊かな富です。結果が私が予想したものと異なるのはなぜですか?
実際、シングルトン オブジェクトはすでに実装されており、それは
リーリーid
的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__
里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__
初始化动作啊, 而且你修改的__init_flag = True
只是在实例对象
里面而已, 并没有修改到类
那边, 所以你的判断在无效的, 只有修改到类
那边的__init_flag
からのみ有効であるため、コードは次のように修正されます:さらに 2 つの提案:
オブジェクトがNoneかどうかを判定する場合は
==
, 应该用is
:cls.__instance is None
false
, 也不要用==
, 应该是not
:if not self.__init_flag