华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python教程 >> 文章內(nèi)容

python怎么實(shí)現(xiàn)單例模式

來(lái)源:中華考試網(wǎng)  [2020年11月6日]  【

  Python單例模式的4種實(shí)現(xiàn)方法:

  #-*- encoding=utf-8 -*-

  print '----------------------方法1--------------------------'

  #方法1,實(shí)現(xiàn)__new__方法

  #并在將一個(gè)類的實(shí)例綁定到類變量_instance上,

  #如果cls._instance為None說(shuō)明該類還沒(méi)有實(shí)例化過(guò),實(shí)例化該類,并返回

  #如果cls._instance不為None,直接返回cls._instance

  class Singleton(object):

  def __new__(cls, *args, **kw):

  if not hasattr(cls, '_instance'):

  orig = super(Singleton, cls)

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

  return cls._instance

  class MyClass(Singleton):

  a = 1

  one = MyClass()

  two = MyClass()

  two.a = 3

  print one.a

  #3

  #one和two完全相同,可以用id(), ==, is檢測(cè)

  print id(one)

  #29097904

  print id(two)

  #29097904

  print one == two

  #True

  print one is two

  #True

  print '----------------------方法2--------------------------'

  #方法2,共享屬性;所謂單例就是所有引用(實(shí)例、對(duì)象)擁有相同的狀態(tài)(屬性)和行為(方法)

  #同一個(gè)類的所有實(shí)例天然擁有相同的行為(方法),

  #只需要保證同一個(gè)類的所有實(shí)例具有相同的狀態(tài)(屬性)即可

  #所有實(shí)例共享屬性的最簡(jiǎn)單最直接的方法就是__dict__屬性指向(引用)同一個(gè)字典(dict)

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

  class Borg(object):

  _state = {}

  def __new__(cls, *args, **kw):

  ob = super(Borg, cls).__new__(cls, *args, **kw)

  ob.__dict__ = cls._state

  return ob

  class MyClass2(Borg):

  a = 1

  one = MyClass2()

  two = MyClass2()

  #one和two是兩個(gè)不同的對(duì)象,id, ==, is對(duì)比結(jié)果可看出

  two.a = 3

  print one.a

  #3

  print id(one)

  #28873680

  print id(two)

  #28873712

  print one == two

  #False

  print one is two

  #False

  #但是one和two具有相同的(同一個(gè)__dict__屬性),見(jiàn):

  print id(one.__dict__)

  #30104000

  print id(two.__dict__)

  #30104000

  print '----------------------方法3--------------------------'

  #方法3:本質(zhì)上是方法1的升級(jí)(或者說(shuō)高級(jí))版

  #使用__metaclass__(元類)的高級(jí)python用法

  class Singleton2(type):

  def __init__(cls, name, bases, dict):

  super(Singleton2, cls).__init__(name, bases, dict)

  Python單例模式的4種實(shí)現(xiàn)方法:  #-*- encoding=utf-8 -*-   print '----------------------方法1--------------------------'   #方法1,實(shí)現(xiàn)__new__方法  #并在將一個(gè)類的實(shí)例綁定到類變量_instance上,   #如果cls._instance為None說(shuō)明該類還沒(méi)有實(shí)例化過(guò),實(shí)例化該類,并返回  #如果cls._instance不為None,直接返回cls._instance   class Singleton(object):   def __new__(cls, *args, **kw):   if not hasattr(cls, '_instance'):   orig = super(Singleton, cls)   cls._instance = orig.__new__(cls, *args, **kw)   return cls._instance   class MyClass(Singleton):   a = 1   one = MyClass()   two = MyClass()   two.a = 3   print one.a   #3   #one和two完全相同,可以用id(), ==, is檢測(cè)  print id(one)   #29097904   print id(two)   #29097904   print one == two   #True   print one is two   #True   print '----------------------方法2--------------------------'   #方法2,共享屬性;所謂單例就是所有引用(實(shí)例、對(duì)象)擁有相同的狀態(tài)(屬性)和行為(方法)   #同一個(gè)類的所有實(shí)例天然擁有相同的行為(方法),   #只需要保證同一個(gè)類的所有實(shí)例具有相同的狀態(tài)(屬性)即可  #所有實(shí)例共享屬性的最簡(jiǎn)單最直接的方法就是__dict__屬性指向(引用)同一個(gè)字典(dict)   #可參看:http://code.activestate.com/recipes/66531/   class Borg(object):   _state = {}   def __new__(cls, *args, **kw):   ob = super(Borg, cls).__new__(cls, *args, **kw)   ob.__dict__ = cls._state   return ob   class MyClass2(Borg):   a = 1   one = MyClass2()   two = MyClass2()   #one和two是兩個(gè)不同的對(duì)象,id, ==, is對(duì)比結(jié)果可看出  two.a = 3   print one.a   #3   print id(one)   #28873680   print id(two)   #28873712   print one == two   #False   print one is two   #False   #但是one和two具有相同的(同一個(gè)__dict__屬性),見(jiàn):   print id(one.__dict__)   #30104000   print id(two.__dict__)   #30104000   print '----------------------方法3--------------------------'   #方法3:本質(zhì)上是方法1的升級(jí)(或者說(shuō)高級(jí))版  #使用__metaclass__(元類)的高級(jí)python用法  class Singleton2(type):   def __init__(cls, name, bases, dict):   super(Singleton2, cls).__init__(name, bases, dict)   cls._instance = None   def __call__(cls, *args, **kw):   if cls._instance is None:   cls._instance = super(Singleton2, cls).__call__(*args, **kw)   return cls._instance   class MyClass3(object):   __metaclass__ = Singleton2   one = MyClass3()   two = MyClass3()   two.a = 3   print one.a   #3   print id(one)   #31495472   print id(two)   #31495472   print one == two   #True   print one is two   #True   print '----------------------方法4--------------------------'   #方法4:也是方法1的升級(jí)(高級(jí))版本,   #使用裝飾器(decorator),   #這是一種更pythonic,更elegant的方法,   #單例類本身根本不知道自己是單例的,因?yàn)樗旧?自己的代碼)并不是單例的  def singleton(cls, *args, **kw):   instances = {}   def _singleton():   if cls not in instances:   instances[cls] = cls(*args, **kw)   return instances[cls]   return _singleton   @singleton   class MyClass4(object):   a = 1   def __init__(self, x=0):   self.x = x   one = MyClass4()   two = MyClass4()   two.a = 3   print one.a   #3   print id(one)   #29660784   print id(two)   #29660784   print one == two   #True   print one is two   #True   one.x = 1   print one.x   #1   print two.x   #1

  cls._instance = None

  def __call__(cls, *args, **kw):

  if cls._instance is None:

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

  return cls._instance

  class MyClass3(object):

  __metaclass__ = Singleton2

  one = MyClass3()

  two = MyClass3()

  two.a = 3

  print one.a

  #3

  print id(one)

  #31495472

  print id(two)

  #31495472

  print one == two

  #True

  print one is two

  #True

  print '----------------------方法4--------------------------'

  #方法4:也是方法1的升級(jí)(高級(jí))版本,

  #使用裝飾器(decorator),

  #這是一種更pythonic,更elegant的方法,

  #單例類本身根本不知道自己是單例的,因?yàn)樗旧?自己的代碼)并不是單例的

  def singleton(cls, *args, **kw):

  instances = {}

  def _singleton():

  if cls not in instances:

  instances[cls] = cls(*args, **kw)

  return instances[cls]

  return _singleton

  @singleton

  class MyClass4(object):

  a = 1

  def __init__(self, x=0):

  self.x = x

  one = MyClass4()

  two = MyClass4()

  two.a = 3

  print one.a

  #3

  print id(one)

  #29660784

  print id(two)

  #29660784

  print one == two

  #True

  print one is two

  #True

  one.x = 1

  print one.x

  #1

  print two.x

  #1

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
朝阳县| 安泽县| 鲜城| 乐山市| 灵武市| 和政县| 泸州市| 雷波县| 九江县| 河北省| 贵州省| 湖北省| 海兴县| 遂溪县| 岗巴县| 金溪县| 金塔县| 满洲里市| 岑巩县| 额尔古纳市| 黔江区| 申扎县| 库尔勒市| 松江区| 阜南县| 海盐县| 湖南省| 蒙城县| 平泉县| 山丹县| 泸州市| 固始县| 蓬莱市| 运城市| 黄陵县| 泸水县| 兖州市| 霍城县| 正蓝旗| 凤台县| 舞阳县|