python中单例模式是什么,python单例模式应用场景

  python中单例模式是什么,python单例模式应用场景

  大蟒通过__新_ _魔法方法放入需要实现的类中,可以保证实例化之后的对象为单例,进而实现单例模式。

  

  Python单例模式的4种实现方法:

  #-*-编码=utf-8-*-

  打印方法1 -

  #方法1,实现__新_ _方法

  #并在将一个类的实例绑定到类变量_实例上,

  #如果cls ._实例为没有人说明该类还没有实例化过,实例化该类,并返回

  #如果cls ._实例不为没有,直接返回cls ._实例

  classSingleton(object):

  def__new__(cls,*args,**kw):

  ifnothasattr(cls, _instance):

  orig=super(Singleton,cls)

  cls ._instance=orig.__new__(cls,*args,**kw)

  returncls ._实例

  classMyClass(单例):

  a=1

  one=MyClass()

  two=MyClass()

  two.a=3

  打印通

  #3

  #一和二完全相同,可以用id(),==,是检测

  printid(一)

  #29097904

  printid(两个)

  #29097904

  printone==two

  #真的

  printoneistwo

  #真的

  打印方法2 -

  #方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)

  #同一个类的所有实例天然拥有相同的行为(方法),

  #只需要保证同一个类的所有实例具有相同的状态(属性)即可

  #所有实例共享属性的最简单最直接的方法就是__词典_ _属性指向(引用)同一个字典(字典)

  #可参看:http://code.activestate.com/recipes/66531/

  班级堡(对象):

  _state={}

  def__new__(cls,*args,**kw):

  ob=超级(博格,cls).__new__(cls,*args,**kw)

  卒于__dict__=cls ._state

  returnob

  classMyClass2(博格):

  a=1

  one=MyClass2()

  two=MyClass2()

  #一和二是两个不同的对象,id,==,是对比结果可看出

  two.a=3

  打印通

  #3

  printid(一)

  #28873680

  printid(两个)

  #28873712

  printone==two

  #错误

  printoneistwo

  #错误

  #但是一个和二具有相同的(同一个__词典_ _属性),见:

  printid(一个。__字典_ _)

  #30104000

  printid(两个。__字典_ _)

  #30104000

  打印方法3 -

  #方法3:本质上是方法一的升级(或者说高级)版

  #使用__元类_ _(元类)的高级大蟒用法

  classSingleton2(类型):

  def__init__(cls,name,bases,dict):

  超级(Singleton2,cls).__init__(名称、基数、字典)

  cls ._ instance=无

  def__call__(cls,*args,**kw):

  ifcls ._ instanceisNone:

  cls ._instance=super(Singleton2,cls).__call__(*args,**kw)

  returncls ._实例

  classMyClass3(对象):

  __元类__=Singleton2

  one=MyClass3()

  two=MyClass3()

  two.a=3

  打印通

  #3

  printid(一)

  #31495472

  printid(两个)

  #31495472

  printone==two

  #真的

  printoneistwo

  #真的

  打印方法4 -

  #方法4:也是方法一的升级(高级)版本,

  #使用装饰器(装修工),

  #这是一种更蟒蛇皮,更优雅的的方法,

  #单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的

  defsingleton(cls,*args,**kw):

  实例={}

  def_singleton():

  ifclsnotininstances:

  实例[cls]=cls(*args,**kw)

  返回实例[cls]

  return _ singleton

  @单身

  classMyClass4(对象):

  a=1

  def__init__(self,x=0):

  self.x=x

  one=MyClass4()

  two=MyClass4()

  two.a=3

  打印通

  #3

  printid(一)

  #29660784

  printid(两个)

  #29660784

  printone==two

  #真的

  printoneistwo

  #真的

  one.x=1

  printone.x

  #1

  printtwo.x

  #1推荐课程:python编程入门系列图文教程

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: