免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3841 | 回复: 2
打印 上一主题 下一主题

请教Python 使用装饰器实现单例模式的原理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-15 21:54 |只看该作者 |倒序浏览
>>> def singleton(cls):
...     instances = {}
...     def _singleton(*args, **kw):
...         print "------" +   str(instances) + "----------"
...         if cls not in instances:
...             instances[cls] = cls(*args, **kw)
...         return instances[cls]
...     return _singleton
...
>>> @singleton
... class MyClass(object):
...     a = 1
...     def __init__(self, x=0):
...         self.x = x
...
>>>
>>> a=MyClass()
------{}----------
>>>
>>> a=MyClass()
------{<class '__main__.MyClass'>: <__main__.MyClass object at 0x7f4a1b3b23d0>}----------
>>>
>>> a=MyClass()
------{<class '__main__.MyClass'>: <__main__.MyClass object at 0x7f4a1b3b23d0>}----------

这种方式虽然实现了单例,,但是想不通 instances看起来像”全局变量“似的。。

难道每一次调用MyClass()
不是相当于singleton(MyClass) 么?

如果是,,那instances不是每次都会被重置为{}么?

可能我对装饰器理解的不是很对,,,求python 大牛,,解释~~~

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
2 [报告]
发表于 2015-07-16 16:04 |只看该作者
本帖最后由 substr函数 于 2015-07-16 16:07 编辑

@deco
def func():
     ...
是下面代码的简写
func = deco(func)
这就是装饰器做的事情
  1. [0]
  2. private =  0
  3. a simple fun
  4. private =  1
  5. a simple fun
  6. private =  2
  7. a simple fun
  8. private =  3
  9. a simple fun
  10. private =  4
  11. a simple fun
  12. [0]
  13. private =  0
  14. a simple2 fun
  15. private =  1
  16. a simple2 fun
  17. private =  2
  18. a simple2 fun
  19. private =  3
  20. a simple2 fun
  21. private =  4
  22. a simple2 fun
复制代码
  1. #!/usr/bin/python2
  2. # coding: utf-8

  3. def deco(f):
  4.     private = [0]
  5.     print private
  6.    
  7.     # wrap 是一个closure
  8.     def wrap():
  9.         print 'private = ', private[0]
  10.         f()
  11.         private[0] += 1
  12.     return wrap

  13. @deco
  14. def simple():
  15.     print "a simple fun"

  16. for i in xrange(5):
  17.     simple()

  18. def simple2():
  19.     print "a simple2 fun"

  20. # @deco
  21. # def simple():
  22. #     ...
  23. # 是下面代码的简写
  24. # simple = deco(simple)
  25. # 这就是装饰器做的事情

  26. simple2 = deco(simple2)

  27. for i in xrange(5):
  28.     simple2()
复制代码

论坛徽章:
0
3 [报告]
发表于 2015-07-19 01:08 |只看该作者
这个机制类似闭包函数,在_singleton函数生存周期内,当初创建这个闭包函数的局部命名空间中的变量并未被销毁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP