一、闭包:
def test(number):
print('------1-------')
def test_in():
print('------2-------')
print (number+100)
print('------3-------')
return test_in()#返回内置函数
ret = test(100)#输出1,3两条线,相当于ret 与 test_in指向同一个函数
ret()#输出2线,200
二、装饰器
在不改变原有函数功能的情况下,添加新的功能
1、常规装饰器
def derect1(fn):
print('正在装饰1')
def inner1():
print('------1------')
return '<b>' + fn() + '</b>'
return inner1
def derect2(fn):
print('正在装饰2')
def inner2():
print('------2------')
return '<i>' + fn() + '</i>'
return inner2
#只要Python解释器执行到了这个代码,就会自动进行装饰,而非等到调用时执行
@derect1
@derect2#等价于:test = derect2(test)
def test():
return 'hello world!'
print(test())#正在装饰2
#正在装饰1
#------1------
#------2------
#<b><i>hello world!</i></b>
2、类当做装饰器:
class Test(object):
def __init__(self,func):
print('初始化')
print('func name is %s'% func.__name__)
self.__func = func
def __call__(self):#由于对象本身不能直接调用,所以用到该方法
print('装饰器中的功能')
self.__func()
@Test#等价于:test = Test(test) 创建一个test对象,让func指向函数
def test():
print('----test----')
test()
3、通用装饰器
def derect(functionName):
def inner(*args,**kwargs):
name = functionName(*args,**kwargs)
return name#没有返回值时,自动返回None
return inner
4、带有参数的装饰器
def func_arg(arg):
def func(functionName):
def inner():
print(arg)
functionName()
return inner
return func
@func_arg('hello')#执行该函数的结果是func函数的引用
#即此句等价于@func
def test():
print('-------test--------')
test()