单利模式及python实现方式的示例分析

  介绍

这篇文章主要介绍了单利模式及python实现方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>单例模式

单例模式(单例模式)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个AppConfig的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建AppConfig对象的实例,这就导致系统中存在多个AppConfig的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象

<强> python实现单例模式

使用模块实现

python的模块就是天然的单例模式,因为模块在第一次导入时,会生成,.pyc文件,当第二次导入时,就会直接加载,.pyc文件,而不会再次执行模块代码,因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

mysingleton。py

class 单:   def 才能foo(自我):   ,,,print (& # 39; foo # 39;)   单=单例()

<强>其他文件

得到mysingleton  import 单例   singleton.foo ()

<>强装饰器实现

def 单例(cls):   _instance 才能=,{}   def 才能包装(* args,, * * kargs):   ,,,if  cls  not 拷贝_instance:   ,,,,,_instance (cls),=, cls (* args,, * * kargs)   ,,,return  _instance (cls)   return 才能包装   @ singleton   class (对象):   def 才能__init__(自我,,x=0):   ,,,self.x =, x   a1 =, (2)   a2 =, (3)

最终实例化出一个对象并且保存在_instance中,_instance的值也一定是

<>强基于__new__方法实现

当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用对象。__new__),实例化对象,然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式

class 单例():   def 才能__new__ (cls, * args,, * * kwargs):   ,,,if  not  hasattr (cls, & # 39; _instance& # 39;):   ,,,,,cls._instance=object.__new__ (cls)   ,,,return  cls._instance      class  (Singleton):   def 才能__init__(自我,x):   ,,self.x=x      一个=(& # 39;汉族# 39;)   b=(& # 39;道# 39;)   打印(a.x)   打印(b.x)

为了保证线程安全需要在内部加入锁

import 线程      class 单例():   锁才能=threading.Lock   def 才能__new__ (cls, * args,, * * kwargs):   ,,,if  not  hasattr (cls, & # 39; _instance& # 39;):   ,,,,,with  cls.lock:   ,,,,,,,if  not  hasattr (cls, & # 39; _instance& # 39;):   ,,,,,,,,,cls._instance=object.__new__ (cls)   ,,,return  cls._instance   class  (Singleton):   def 才能__init__(自我,x):   ,,self.x=x   一个=(& # 39;汉族# 39;)   b=(& # 39;道# 39;)   打印(a.x)   打印(b.x)

<强>两大注意:

1。除了模块单例外,其他几种模式的本质都是通过设置中间变量,来判断类是否已经被实例。中间变量的访问和更改存在线程安全的问题:在开启多线程模式的时候需要加锁处理。

2只;__new__方法无法避免触发__init__(),初始的成员变量会进行覆盖。其他方法不会。

<>强PS:下面看下Python单例模式的4种实现方法

# - *安康;编码=utf-8  - *安康;   print  & # 39; - - - - - - - - - - - - - - - - - - - - - - -方法1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - & # 39;,   1 #方法,实现__new__方法,   #并在将一个类的实例绑定到类变量_instance上,,   #如果cls._instance为没有说明该类还没有实例化过,实例化该类,并返回,   #如果cls._instance不为None,直接返回cls._instance    class 单例(对象):   def 才能__new__ (cls, * args,, * *千瓦):,   ,,,if  not  hasattr (cls, & # 39; _instance& # 39;):,   ,,,,,orig =,超级(Singleton, cls),   ,,,,,cls._instance =, orig.__new__ (cls, * args,, * *千瓦),   ,,,return  cls._instance    class  MyClass (Singleton):,   a 才能=,1,   时间=one  MyClass (),   时间=two  MyClass (),   two.a =, 3,   print  one.a    # 3,   # 1和2完全相同,可以用id(),,==,,是检测,   print  id(一),   # 29097904,   print  id(两个),   # 29097904,   print  one ==, two    # True    print  one  is  two    # True    print  & # 39; - - - - - - - - - - - - - - - - - - - - - - -方法2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - & # 39;,   2 #方法,共享属性;所谓单例就是所有引用(实例,对象)拥有相同的状态(属性)和行为(方法),   #同一个类的所有实例天然拥有相同的行为(方法),,   #只需要保证同一个类的所有实例具有相同的状态(属性)即可,   #所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引)用同一个字典(东西),   #可参看:http://code.activestate.com/recipes/66531/    class  Borg(对象):   _state 才能=,{},   def 才能__new__ (cls, * args,, * *千瓦):,   ,,,ob =,超级(Borg, cls) . __new__ (cls, * args,, * *千瓦),   ,,,ob.__dict__ =, cls._state    ,,,return  ob    class  MyClass2 (Borg):   a 才能=,1,   时间=one  MyClass2 (),   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

单利模式及python实现方式的示例分析