1.装饰器
装饰器用到了@语法和闭包以及动态参数
这三个功能我都是第一次接触
1.动态参数
*arg **kwarg 这样的写法,
*arg是传单独的变量,a,b…
**kwarg是传字典形式的变量,a:‘11’,b:‘12’…
但是传入的变量的数量不固定,可以任意多,也可以没有。
2.闭包
闭包声明一个在函数内的函数,闭包应用相当最后输出的的是函数名,
如下,func只是得到一个函数名,运行这个函数必须在func后面加上括号才会运行。
闭包相当于只声明函数,不运行函数,到外部需要运行时候加上括号即可运行。
def org():
def fun():
return '输出'
return fun
func = org()
res =func()
print(res)
3.@语法
@函数名
func():pass
相当于
func = 函数名(func)
4.装饰器
装饰器可以在原来函数基础上添加新的功能,相当于锦上添花,给原来函数装饰起来,用起来更好用。
以下outer函数相当于在func函数内前后加上了两个print。这个替换成其他函数可以实现一些新的功能。
import functools
def outer(origin):
def inner(*arg,**kwarg):
print('befer') #执行前
res = origin(*arg,**kwarg) #动态参数
print('after') #执行后
return res
return inner
@outer #装饰器
def func(pre):
print('我是函数')
return pre
if __name__ =='__main__':
result = func(100)
print(result)
最终版应该为以下样子,加入了functools.wraps实现了函数伪装。
'''
@函数名
def func()
相当于 func= 函数名(func)
@语法
原函数封装在闭包中
可以扩展原函数功能
'''
import functools
def outer(origin):
@functools.wraps(origin) #将此装饰器修改的函数的函数名和注释修改成原来的函数 伪装功能 inner.__name__=origin.__name__ inner.__doc__ = origin.__name__
def inner(*arg,**kwarg):
print('befer') #执行前
res = origin(*arg,**kwarg) #动态参数
print('after') #执行后
return res
return inner
@outer #装饰器
def func(pre):
print('我是函数')
return pre
@outer #装饰器
def func1(num1,num2):
print('我是函数1')
return [num1,num2]
if __name__ =='__main__':
result = func(100)
print(result)
result = func1(10,20)
print(result)
2.总结
自己记性不太好,学了总忘记了,装饰器挺重要,为了防止自己忘记,还是专门写了一些东西