单例模式是最常见的一种设计模式,在python 环境中我们可以尝试以下的这几种方法创建程序中的单例:
1. 命名绑定单例示例
# -*- coding:utf-8 -*-
class singleton(object):
print("单例对象")
singleton = singleton()
通过将类实例化后赋值给与类名同名的变量,通过名字污染(也即命名绑定)的方式,将同名变量成为该类的唯一对象。
2. 使用重写new方法创建单例示例
>>> import singleton >>> singleton.a = 1 >>> singleton.b = 10 >>> singleton.a = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "singleton.py", line 9, in __setattr__ raise self.ConstError singleton.ConstError >>> del singleton.a Traceback (most recent call last): File "<stdin>", line 1, in <module> File "singleton.py", line 13, in __delattr__ raise self.ConstError singleton.ConstError |
运行结果显示:
4420876176 python 4420876176 python
通过继承 Singleton,Singleton 的子类们都能实现单例。
3. 使用装饰器实现单例示例
# -*- coding:utf-8 -*- class Singleton(type): def __init__(self,name,bases,class_dict): super(Singleton,self).__init__(name,bases,class_dict) self._instance=None def __call__(self,*args,**kwargs): if self._instance is None: self._instance=super(Singleton,self).__call__(*args,**kwargs) return self._instance class aClass(object): __metaclass__ = Singleton a = aClass() b = aClass() print id(a),id(b) |
运行结果显示:
4540662416 4540662416
这种方式实现的单例非常优雅,只要在需要实现单例能力的类定义前添加一行@singleton的装饰声明就搞定了,对业务代码逻辑的干扰最小,非常推荐使用该方式实现单例。
4. 使用模块实现单例示例
# -*- coding:utf-8 -*- # -- file:singleton.py -- class _singleton(object): class ConstError(TypeError): pass def __setattr__(self,name,value): if name in self.__dict__: raise self.ConstError self.__dict__[name]=value def __delattr__(self,name): if name in self.__dict__: raise self.ConstError raise NameError import sys sys.modules[__name__] = _singleton() sys.modules[__name__] = _singleton() |
导入运行singleton.py的结果显示:
>>> singleton.a = 1 >>> singleton.b = 10 >>> singleton.a = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "singleton.py", line 9, in __setattr__ raise self.ConstError singleton.ConstError >>> del singleton.a Traceback (most recent call last): File "<stdin>", line 1, in <module> File "singleton.py", line 13, in __delattr__ raise self.ConstError singleton.ConstError |
利用模块在程序中仅加载一次的特点,也能实现单例。
5. 使用元类实现单例示例
# -*- coding:utf-8 -*- class Singleton(type): def __init__(self,name,bases,class_dict): super(Singleton,self).__init__(name,bases,class_dict) self._instance=None def __call__(self,*args,**kwargs): if self._instance is None: self._instance=super(Singleton,self).__call__(*args,**kwargs) return self._instance class aClass(object): __metaclass__ = Singleton a = aClass() b = aClass() print id(a),id(b) |
运行结果显示:
4347213456 4347213456
使用 python 的高级语法构造 Singleton 元类来实现单例,是最为底层的实现方式。
版权声明:51Testing软件测试网原创出品,未经明确的书面许可,任何人或单位不得对本文进行复制、转载或镜像,否则将追究法律责任。