如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现。
在 Python 中实现单例模式有很多种方式,可以通过传统的在定义类的时候判断, 也可以通过模块级别的变量来实现,也可以通过装饰器实现等等, 有很多种方法可以实现。 但是基本上这些方法都可以破解 ;)
比如:
# 存储在类属性中,通过类方法去获取
class Singleton:
__instance = None
@classmethod
def instance(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = cls(*args, **kwargs)
return cls.__instance
# 在类的 __new__ 方法中判断
class Singleton:
__instance = None
def __new__(cls, *args, **kwargs):
if Singleton.__instance is None:
Singleton.__instance = object.__new__(cls, *args, **kwargs)
return Singleton.__instance
s1 = Singleton()
s2 = Singleton()
assert id(s2) == id(s1)
# 依附在一个可变对象上
def Singleton(*args, **kwargs):
if Singleton.__instance is not None:
return Singleton.__instance
class _Singleton:
def __init__(self):
pass
Singleton.__instance = _Singleton(*args, **kwargs)
return Singleton.__instance
Singleton.__instance = None
s1 = Singleton()
s2 = Singleton()
assert id(s1) == id(s2)
# 闭包
class _Singleton:
def __call__(self):
return self
Singleton = _Singleton()
del _Singleton
s1 = Singleton()
s2 = Singleton()
assert id(s1) == id(s2)
更多单例模式的实现详见: The Singleton Pattern implemented with Python « Python recipes « ActiveState Code
Comments