视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
常见的在Python中实现单例模式的三种方法
2020-11-27 14:32:29 责编:小采
文档


单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在Python中,单例模式有以下几种实现方式。

方法一、实现__new__方法,然后将类的一个实例绑定到类变量_instance上;如果cls._instance为None,则说明该类还没有被实例化过,new一个该类的实例,并返回;如果cls._instance不为None,直接返回_instance,代码如下:

class Singleton(object):
 
 def __new__(cls, *args, **kwargs):
 if not hasattr(cls, '_instance'):
 orig = super(Singleton, cls)
 cls._instance = orig.__new__(cls, *args, **kwargs)
 return cls._instance
 
class MyClass(Singleton):
 a = 1
 
one = MyClass()
two = MyClass()
 
#one和two完全相同,可以用id(), ==, is检测
print id(one) # 29097904
print id(two) # 29097904
print one == two # True
print one is two # True

方法二、本质上是方法一的升级版,使用__metaclass__(元类)的高级python用法,具体代码如下:

class Singleton2(type):
 
 def __init__(cls, name, bases, dict):
 super(Singleton2, cls).__init__(name, bases, dict)
 cls._instance = None
 
 def __call__(cls, *args, **kwargs):
 if cls._instance is None:
 cls._instance = super(Singleton2, cls).__call__(*args, **kwargs)
 return cls._instance
 
class MyClass2(object):
 __metaclass__ = Singleton2
 a = 1
 
one = MyClass2()
two = MyClass2()
 
print id(one) # 31495472
print id(two) # 31495472
print one == two # True
print one is two # True


方法三、使用Python的装饰器(decorator)实现单例模式,这是一种更Pythonic的方法;单利类本身的代码不是单例的,通装饰器使其单例化,代码如下:

def singleton(cls, *args, **kwargs):
 instances = {}
 def _singleton():
 if cls not in instances:
 instances[cls] = cls(*args, **kwargs)
 return instances[cls]
 return _singleton
 
@singleton
class MyClass3(object):
 a = 1
 
one = MyClass3()
two = MyClass3()
 
print id(one) # 29660784
print id(two) # 29660784
print one == two # True
print one is two # True

下载本文
显示全文
专题