装饰器
1.形式
-
装饰器是有python 的
@
语法和闭包的知识结合使用的 -
常见的装饰器形式
def outer(origin): def inner(): '''你猜''' print("啊哈哈")#函数执行前 res=origin() print("啊哈哈哈")#函数执行后 return inner # 返回原函数并且不带括号 @outer # 相当与执行 func=outer(func) def func(): print("aaa") func()
-
def 外函数(函数): def 内函数(): 函数() return 内函数
2.带参数的装饰器
-
函数的参数可以有很多,为了接收任意的参数使用的参数是
*args
和**kwargs
-
def outer(origin): def inner(*args,**kwargs): '''你猜''' print("啊哈哈")#函数执行前 res=origin(*args,**kwargs) print("啊哈哈哈")#函数执行后 return inner # 返回原函数并且不带括号 @outer # 相当与执行 func=outer(func) def func(): print("aaa") func()
3.装饰器的扩展
3.1 补充内置函数
def admin():
'''这是一个管理员函数'''
print("adminxxxxx")
# 获取函数的名字
print(admin.__name__)
# 获取函数中的注释
print(admin.__doc__)
-
被装饰器修饰后
-
def outer(orign): def inner(*args,**kwargs): '''这是装饰器内的函数''' res=orign(*args,**kwargs) return inner @outer def admin(): '''这是一个管理员函数''' print("adminxxxxx") # 获取函数的名字 print(admin.__name__) # 获取函数中的注释 print(admin.__doc__)
-
经过装饰器修饰后,获得的函数名是装饰器内的函数名与注释,被装饰的函数相当于为函数前后添加功能
3.2 functools
-
import functools def outer(orign): # inner.__name__=orign.__name__;inner.__doc__=orign.__doc__; @functools.wraps(orign) def inner(*args,**kwargs): '''这是装饰器内的函数''' res=orign(*args,**kwargs) return inner @outer def admin(): '''这是一个管理员函数''' print("adminxxxxx") # 获取函数的名字 print(admin.__name__) # 获取函数中的注释 print(admin.__doc__)
-
因此:编写装饰器的时候可以加上
@functools.wraps(函数参数)
天雨虽宽不润无根之草,学习虽难勤奋可达巅峰;