코드는 다음과 같습니다.
으아악실행 결과:
내 질문:
내 생각에 따르면 이 코드에 작성한 내용은 Dog 클래스를 디자인한 다음 싱글톤 개체(첫 번째 빨간색 상자의 코드), 즉 궁극적으로 a와 b의 인스턴스를 만드는 것입니다. 실제로는 같은 것입니다.
그런 다음 이 싱글톤 개체를 설정하고 한 번만 초기화했습니다(두 번째 빨간색 상자의 코드 참조). 즉, 인스턴스 a가 생성된 후 이름이 Wangcai이고, 인스턴스 b가 생성된 후에는 다음과 같습니다. 초기화되지 않으므로 Roaring Sky Dog라는 이름을 인쇄하는 것이 불가능해야 합니다. 내 생각에 따르면 인쇄되어야 할 결과는 두 가지 번영하는 부입니다. 이제 결과가 내가 예상한 것과 다른 이유는 무엇입니까?
阿神2017-06-28 09:26:24
실제로 이미 싱글톤 개체를 구현했으며 id
的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__
里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__
初始化动作啊, 而且你修改的__init_flag = True
只是在实例对象
里面而已, 并没有修改到类
那边, 所以你的判断在无效的, 只有修改到类
那边的__init_flag
부터만 유효하므로 코드는 다음과 같이 수정됩니다.
두 가지 추가 제안:
객체가 None인지 판단할 때 ==
, 应该用is
: cls.__instance is None
false
, 也不要用==
, 应该是not
: if not self.__init_flag