单例模式(singleton pattern)是一种常用软件设计模式,该模式主要目的是确保某一个类只有一个实例存在。
下面几种方法的原理都是类似的,就是在导入/创建时判断是否唯一。
模块只会在第一次导入时加载,就是单例模式。
因此,只需要把相关函数和数据定义在一个模块中,就可以获得一个单例类。
# singleton module
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
将上面的代码保存到mysingleton.py中,要使用时,直接导入这个对象。
from mysingleton import singleton
使用装饰器修饰类,在装饰器函数中维护一个字典对象,该字典缓存了所有单例类,在实例化类时装饰器进行判断,如果该类已存在则S
# decoration singleton
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = A(2)
a2 = A(3)
print(‘a1.a=%d, a1.x=%d; a2.a=%d, a2.x=%d‘%(a1.a, a1.x, a2.a, a2.x))
# singleton __new__()
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Myclass(Singleton):
a = 1
a1 = Myclass()
a2 = Myclass()
print(a1 == a2, a1 is a2)
# singleton metaclass
class Singleton(type):
print(‘www‘)
def __call__(cls, *args, **kwargs):
if not hasattr(cls, ‘_instance‘):
print(cls)
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class MyClass(metaclass=Singleton):
a = 4
a1 = MyClass()
a2 = MyClass()
print(a1 == a2) #True
原文:https://www.cnblogs.com/wodeboke-y/p/9795282.html