1、闭包的实现
- #coding:utf-8
- def A():
- s1=2
- def B():
- sum1=s1+2
- return sum1
- return B
- if __name__ == '__main__':
- f1=A()
- f2=f1()
- print 'f1: ',f1
- print 'f2: ',f2
- 输出:
- f1: <function B at 0x02BDEB30>
- f2: 4
可以看出f1为一个函数,调用这个函数时,才会返回值
闭包可以使得内函数返回的局部变量的生命周期与整个项目相同,即sum1会一直保留到整个工程运行结束,而不是这个函数执行完。
2、python 装饰器
- def fun1(fun):
- print 'fun1 action'
- return fun
- @fun1
- def fun2():
- print 'fun2 action'
- if __name__ == '__main__':
- fun2()
- 输出:
- fun1 action
- fun2 action
3、装饰器+闭包实现单例模式
单例模式:顾名思义,一个类,在整个项目的运行周期内只有一个实例
实现:
- def singleton(cls, *args, **kw):
- instance={}
- def _singleton():
- if cls not in instance:
- instance[cls]=cls(*args, **kw)
- return instance[cls]
- return _singleton
- @singleton
- class test_singleton(object):
- def __init__(self):
- self.num_sum=0
- def add(self):
- self.num_sum=100
- 输出:
- <__main__.test_singleton object at 0x023F6AD0>
- <__main__.test_singleton object at 0x023F6AD0>
不使用单例模式时:
- class test_singleton(object):
- def __init__(self):
- self.num_sum=0
- def add(self):
- self.num_sum=100
- if __name__ == '__main__':
- cls1= test_singleton()
- cls2= test_singleton()
- print cls1
- print cls2
- 输出:
- <__main__.test_singleton object at 0x022569F0>
- <__main__.test_singleton object at 0x02256A10>
至于单例模式在python中的作用,我第一次使用,是因为传参传了太多层,以至于我找不到参数是哪里来的了(传参为类),可是如果把传的参数设置成单例模式,便可以直接在程序中直接使用该类的成员变量,通过类名().变量名的形式,而不需要再进行参数传递,数据是从哪里来的,也一目了然,感觉比较方便。