Method 1: 装饰器
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class MyClass(BaseClass):
pass
优点: 装饰器是以一种比多重继承更直观的方式
缺点: 虽然实例化后的MyClass()将是真正的单例对象,但MyClass它本身是一个函数,而不是一个类,所以不能从中调用类方法。
x = MyClass();
y = MyClass();
t = type(MyClass)();
then x == y but x != t && y != t
Method 2: 基类
class Singleton(object):
_instance = None
def __new__(class_, *args, **kwargs):
if not isinstance(class_._instance, class_):
class_._instance = object.__new__(class_, *args, **kwargs)
return class_._instance
class MyClass(Singleton, BaseClass):
pass
优点:这是一个真正的类
缺点:多重继承,__new__可以在被第二个基类覆盖。
Method 3: 元类(metaclass)
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
#Python2
class MyClass(BaseClass):
__metaclass__ = Singleton
#Python3
class MyClass(BaseClass, metaclass=Singleton):
pass
优点:
这是一真正的类
可以__new__不会被继承所覆盖
缺点
我还没找到
Method 4: 应用一个模块
singleton.py 可以解决你的问题
优点: 简单胜于复杂
缺点: 不会延迟实例化