python实现单例模式的方法:
1. 使用模块
python的模块在第一次导入时会生成.pyc文件,当第二次导入时就会直接加载.pyc文件,而不会再次执行模块代码。
只需将其单独放在一个模块里,并创建一个实例,外部使用时直接调用该实例即可。
2. 使用__new__方法
1 class Singleton: 2 _instance = None 3 def __new__(cls, *args, **kwargs): 4 if cls._instance is not None: 5 cls._instance = super().__new__(*args, **kwargs) 6 return cls._instance 7 8 9 class Myclass(Singleton): 10 a = 1 11 12 class1 = Myclass() 13 class2 = Myclass() 14 print(class1 is class2)
输出结果:
True
3. 使用装饰器
1 from functools import wraps 2 3 4 def singleton(cls): 5 instances = {} 6 @wraps(cls) 7 def getinstance(*args, **kwargs): 8 if cls not in instances: 9 instances[cls] = cls(*args, **kwargs) 10 return instances[cls] 11 return getinstance 12 13 @singleton 14 class Myclass(): 15 a = 1 16 17 class1 = Myclass() 18 class2 = Myclass() 19 print(class1 is class2)
输出结果:
True
4. 使用元类metaclass
1 class Singleton(type): 2 instances = {} 3 def __call__(cls, *args, **kwargs): 4 if cls not in cls.instances: 5 cls.instances[cls] = super().__call__(*args, **kwargs) 6 return cls.instances[cls] 7 8 9 class Myclass(metaclass=Singleton): 10 a = 1 11 12 class1 = Myclass() 13 class2 = Myclass() 14 print(class1 is class2)
输出结果:
True