装饰器实现单例模式
2017-03-03 19:11
155 查看
用装饰器实现单例模式,应该算一个很不错的例子。
我们知道,python中装饰器无非是对对象的重新包装,这个对象可以是函数,也可以是一个类
不难发现,test其实就是wrap,我们可以在wrap中实现test的逻辑,并添加一些我们想要附加的特性,这样,相当于将test包装了一下,也就是‘装饰’了一下
由于类也可以被装饰,我们以单例模式的实现为例
能想到的办法一
也可以写成将装饰器写成类的形式
关于单例模式,有很多更方便的方法,这里主要用来熟悉下装饰器
下篇补充下 带参数的装饰器 以及functools.wraps
我们知道,python中装饰器无非是对对象的重新包装,这个对象可以是函数,也可以是一个类
@decorate def test():相当于 test = decorate(test)
def decorate(func): def wrap(*args,**kwargs): ***** return return wrap
不难发现,test其实就是wrap,我们可以在wrap中实现test的逻辑,并添加一些我们想要附加的特性,这样,相当于将test包装了一下,也就是‘装饰’了一下
由于类也可以被装饰,我们以单例模式的实现为例
能想到的办法一
def single01(cls): s=[] //这里定义了一个私有列表,也可以声明一个变量,在wrap用关键字nonlocal去调用 def wrap(*args,**kwargs): if not s: s.append(cls(*args,**kwargs)) return s return wrap @single01 class A(object): def __init__(self,name): self.name = name //试一下 >>> a = A("tmac") >>> b = A("kobe") >>> >>> a is b True
也可以写成将装饰器写成类的形式
class single03(object): def __init__(self,cls): self._cls = cls self._instances = None; def __call__(self,*args): if not self._instances: self._instances = self._cls(*args) return self._instances //一样调用 @single03 class A(object): def __init__(self,name): self.name = name
关于单例模式,有很多更方便的方法,这里主要用来熟悉下装饰器
下篇补充下 带参数的装饰器 以及functools.wraps
相关文章推荐
- 在C#中使用装饰器模式和扩展方法实现Fluent Interface
- 装饰器模式实现文件IO流的ZIP压缩解压(二)
- Head First 设计模式——装饰器(Decorator Pattern)——Python实现
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
- 装饰器模式实现文件IO流的ZIP压缩解压(一)
- python实现单粒模式,模块方法/装饰器方法/__new__方法
- 在C#中使用装饰器模式和扩展方法实现Fluent Interface
- 在C#中使用装饰器模式和扩展方法实现Fluent Interface
- JScript下Singleton模式的实现。
- Singleton模式的C++实现研究(转贴)
- 用Java实现的设计模式系列(3)--Builder
- AspectJ实现设计模式(一)——观察者模式
- AspectJ实现设计模式(七)—装饰模式
- 分析模式-计量的C++实现——完美版本
- AspectJ实现设计模式(四)——抽象工厂模式
- Singleton模式之Delphi实现
- Template 模式之Delphi实现
- AspectJ实现设计模式(二)——策略模式
- 如何在程序中实现XP模式
- 从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性