jokerchu 发表于 2015-11-30 09:40:57

python的类装饰器和单例模式

  python中经常使用到装饰器来修饰函数,但是装饰器还可以修饰class。
  对于一个函数装饰器,主要是返回一个修饰过的函数,class的装饰器原理类似。
  

# coding: utf-8  

  
def add_method(cls):
  class _newClass(cls):
  def __init__(self):
  print '_newClass'
  # cls.__init__(self)
  super(_newClass, self).__init__()
  

  def new_method(self):
  print 'new_method'
  

  return _newClass
  

  

  
@add_method
  
class Test(object):
  

  def __init__(self):
  print 'init'
  

  def hello(self):
  print 'hello'
  

  

  
if __name__ == '__main__':
  
  t = Test()
  t.hello()
  t.new_method()
  
  

  我们看到,在add_method这个装饰器中重新定义一个class继承Test,增加了一个新的成员函数,然后将新的类返回。
  这样等于是对原来的Test类进行了修饰。现在生成的对象t不仅仅可以调用原来的函数,还可以调用新增加的函数,看起来就像装饰器给它增加了一个类。

单例模式
  代码如下:
  

# coding: utf-8  

  
def add_method(cls):
  class _newClass(cls):
  def __init__(self):
  print '_newClass'
  # cls.__init__(self)
  super(_newClass, self).__init__()
  

  def new_method(self):
  print 'new_method'
  

  return _newClass
  

  

  
def singleton(cls):
  instances = {}
  

  def _singleton(*args, **kw):
  if cls not in instances:
  instances = cls(*args, **kw)
  return instances
  return _singleton
  

  

  
@singleton
  
class Test(object):
  

  def __init__(self):
  print 'init'
  

  def hello(self):
  print 'hello'
  

  

  
if __name__ == '__main__':
  
  for i in range(10):
  t = Test()

  print>  

  

  

  singleton这个装饰器跟上面不同,它返回一个产生实例的函数,这个函数无论调用多少次,产生的都是同一个对象。
  原因在于:这里返回_singleton,而_singleton内部又引用了instances这个函数内的对象,这就是所谓的闭包。
  当调用一次Test产生一个对象t后,产生了一个闭包,这个instances始终存在。不停的调用Test()实质上是在不同的调用这个闭包。
  这就是python中单例模式的原理。
页: [1]
查看完整版本: python的类装饰器和单例模式