最近在读《编写高质量代码:改善 Python 程序的 91 个建议》这本书,我在作者给出的双检查锁单例模式基础上做了一点改写,精简了冗余的部分,如下:
import threading
class Singleton:
_instances = {}
_instance_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
with cls._instance_lock:
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instances[cls]
但是作者指出这个版本的单例有两个问题:
Singleton
的子类重载了 __new__()
方法,会覆盖或干扰 Singleton
类中 __new__()
的执行,虽然这种情况出现的概率极小,但不可忽视。__init__()
方法,那么每次实例化该 Singleton
的时候,__init__()
都会被调用到,这显然是不应该的,__init__()
只应该在创建实例的时候被调用一次。我不太理解 Python 中子类和父类中方法加载的顺序,因此不太明白作者说的这两个问题是什么意思?是否有可能举出例子呢?谢谢~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.