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
@fun1的功能:实际上是将fun2作为参数传递fun1再进行执行
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中的作用,我第一次使用,是因为传参传了太多层,以至于我找不到参数是哪里来的了(传参为类),可是如果把传的参数设置成单例模式,便可以直接在程序中直接使用该类的成员变量,通过类名().变量名的形式,而不需要再进行参数传递,数据是从哪里来的,也一目了然,感觉比较方便。
另:python中的单例模式还有其他多种实现方式,个人觉得这种最容易理解,至于使用单例模式的缺点暂时还没研究,有了解的还望不吝赐教O(∩_∩)O
----------------------python学习笔记-----------------------------------