Python环境中的单例创建方法

发表于:2018-2-05 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:51Testing    来源:51Testing软件测试网原创

  单例模式是最常见的一种设计模式,在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软件测试网原创出品,未经明确的书面许可,任何人或单位不得对本文进行复制、转载或镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号