文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Think in Python Design Pattern -- Singleton

Think in Python Design Pattern -- Singleton

时间:2011-05-22  来源:pyzend

可能最简单的设计模式就是单件模式--提供一个单一的实例给特定的类,主要是控制对象实例的生成。

1.一个最简单的方法是提供一个内部的嵌套类来实现单件模型代理

class OnlyOne: 
  class __OnlyOne: 
    def __init__(self, arg): 
      self.val = arg 
    def __str__(self): 
      return `self` + self.val 
  instance = None 
  def __init__(self, arg): 
    if not OnlyOne.instance: 
      OnlyOne.instance = OnlyOne.__OnlyOne(arg) 
    else: 
      OnlyOne.instance.val = arg 
  def __getattr__(self, name): 
    return getattr(self.instance, name)
 
使用了 非直接访问类__OnlyOne的默认构造器来控制OnlyOne实例的生成。__getattr__()代理访问实例的属性。
 
 
使用例子:
 
x = OnlyOne('sausage') 
print x 
y = OnlyOne('eggs') 
print y 
z = OnlyOne('spam') 
print z 
print x 
print y 
print `x` 
print `y` 
print `z` 
output = ''' 
<__main__.__OnlyOne instance at 0076B7AC>sausage 
<__main__.__OnlyOne instance at 0076B7AC>eggs 
<__main__.__OnlyOne instance at 0076B7AC>spam 
<__main__.__OnlyOne instance at 0076B7AC>spam 
<__main__.__OnlyOne instance at 0076B7AC>spam 
<__main__.OnlyOne instance at 0076C54C> 
<__main__.OnlyOne instance at 0076DAAC> 
<__main__.OnlyOne instance at 0076AA3C> 
''' 
#:~ 

以上代码实现了单件模式,但遇到多线程(进行)应用时会问题,因为它限制了“共享对象”池的使用,以下是共享对象池的实现版本:
singleton_2.py
class OnlyOne(object):
class __OnlyOne: def __init__(self): self.val = None def __str__(self): return 'self' + self.val instance = None def __new__(cls): if not OnlyOne.instance: OnlyOne.instance = OnlyOne.__OnlyOne() return OnlyOne.instance def __getattr__ (self, name): return getattr(self.instance, name) def __setattr__ (self, name): return setattr(self.instance, name)

2. 可重用的Singleton

Alex Martelli的'Borg'类:
通过设定__dict__实例属性来达到共享实例的目地。
singleton_Borg.pyclass Borg:
    _share_state = {}
    def __init__ (self):
        self.__dict__ = self._share_state

class Singleton(Borg):
    def __init__ (self, arg):
        Borg.__init__(self)
        self.val = arg
        def __str__ (self):
            return self.val
          
x = Singleton('test')
print x

        


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载