最近在读《编写高质量代码:改善 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 中子类和父类中方法加载的顺序,因此不太明白作者说的这两个问题是什么意思?是否有可能举出例子呢?谢谢~