python中实现单例模式的方式大致有四种:
1.模块
2.改写类的__new__方法,控制实例生成
3.装饰器
4.元类
1.模块
python中的模块是天然的单例模式,并且是线程安全的,所有的模块只会在运行时加载一次。
所以,利用模块就可以实现一个线程安全的单例。如:
1 2 3 4 5
| class My_singleton(object): def foo(self): pass my_singleton = My_singleton()
|
- __new__方法
python中每个类在实例化对象时,首先会调用__new__方法创建一个实例,然后再调用__init__方法动态绑定其他属性.如:
1 2 3 4 5 6 7 8
| class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls._instance class MyClass(Singleton): a = 1
|
3.装饰器
装饰器可以动态的修改一个类或方法的表现,利用装饰器生成单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from functools import wraps
def singleton(cls): instances = {}
@wraps(cls) def getinstance(*args, **kw): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls]
return getinstance
@singleton class MyClass(object): a = 1
|
4.元类
元类可以控制其子类的类对象(new)及类实例对象(call)的创建。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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]
class MyClass(object): __metaclass__ = Singleton
|
最著名的就是Django中的ORM,其model中就使用了元类来控制所有model的表现
关于头图
摄于内蒙古乌兰布统草原