Python 单例模式

1 __new__ 方法

  • __new__(cls, *args, **kwargs) 创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
  • __init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身

In [4]:
class Singleton(object):  
    def __new__(cls, *args, **kwargs):  
        if not hasattr(cls, '_instance'):  
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)  
        return cls._instance
class MyClass(object):
    pass

In [6]:
single1 = Singleton()
single2 = Singleton()
myclass1 = MyClass()
myclass2 = MyClass()
print id(single1) == id(single2)
print id(myclass1) == id(myclass2)


True
False

2 使用类(class)装饰器


In [7]:
from functools import wraps
def singleton(cls):  
    instances = {}  
    @wraps(cls)  
    def wrapper(*args, **kwargs):  
        if cls not in instances:  
            instances[cls] = cls(*args, **kwargs)  
        return instances[cls]  
    return wrapper
@singleton  
class MyClass(object):  
    pass

In [8]:
myclass1 = MyClass()
myclass2 = MyClass()
print id(myclass1) == id(myclass2)


True

3 使用GetInstance方法,非线程安全


In [11]:
class MySingleton(object):  
    @classmethod
    def getInstance(cls):  
        if not hasattr(cls, '_instance'):  
            cls._instance = cls()  
        return cls._instance
mysingleton1 = MySingleton.getInstance()
mysingleton2 = MySingleton.getInstance()
print id(mysingleton1) == id(mysingleton2)


True