不修改原函数的条件下,实现在函数执行前和执行后分别输出’before’ 和 ‘after’
def func():
print("我是func函数")
value = (11, 22, 33, 44)
return value
result=func()
print(result)
装饰器
- 实现原理:基于@语法和函数闭包,将原函数封装在闭包中,然后将内部函数赋值为一个新的函数(内层函数),执行函数时(就会执行内层函数)再在内层函数中执行闭包中的原函数
- 实现效果:可以在不改变原函数内部代码和调用方式的前提下,实现在函数执行和执行扩展功能
- 适用场景:多个函数统一在执行前后执行自定义的相同功能
import functools
def outer(origin):
@functools.wraps(origin)
def inner(*args,**kwargs):
#执行前
res=origin()
#执行后
return res
return inner
@outer
def func():
pass
func()
装饰器推导过程
- 过程1,添加函数嵌套
def func():
print("我是func函数")
value = (11, 22, 33, 44)
return value
def outer(origin):
def inner():
print('before')
#调用传入的函数
res=origin()
print('after')
return res
return inner
#func=outer(func)=inner
func=outer(func)
#func()=inner()
func()
- 过程2,添加@函数名
def outer(origin):
def inner():
print('before')
#调用传入的函数
res=origin()
print('after')
return res
return inner
# func=outer(func)
#Python中支持特殊语法,在某个函数上方使用@函数名(@outer),内部会自动执行@outer(func),执行完毕将返回值(inner)赋值给func
@outer
def func():
print("我是func函数")
value = (11, 22, 33, 44)
return value
#func()==inner()
func()
- 过程3添加参数
#传参
def outer(origin):
def inner(*args,**kwargs):
print('before')
#调用传入的函数
res=origin(*args,**kwargs)
print('after')
return res
return inner
# func=outer(func)
@outer
def func(a1):
print("我是func函数")
value = (11, 22, 33, 44)
return value
func(1)
- 执行原函数
import functools
def outer(origin):
@functools.wraps(origin)
def inner(*args,**kwargs):
print('before')
#调用传入的函数
res=origin(*args,**kwargs)
print('after')
return res
return inner
# func=outer(func)
@outer
def func(a1):
print("我是func函数")
value = (11, 22, 33, 44)
return value
func(1)
print(func.__name__) #获取函数名称
print(func.__doc__) #获取函数注释文本
functools
装饰器实际上就是将原函数更改为其他函数,然后再此函数中再去调用原函数,要执行原函数,要用functools;
不用functools也可以实现装饰器的基本功能,后期项目开发,不加会报错,所以要规范写法
import functools
def outer(origin):
@functools.wraps(origin)
def inner(*args,**kwargs):
print('before')
#调用传入的函数
res=origin(*args,**kwargs)
print('after')
return res
return inner
# func=outer(func)
@outer
def func(a1):
print("我是func函数")
value = (11, 22, 33, 44)
return value
func(1)
print(func.__name__)
print(func.__doc__)
总结:装饰器,在不修改原函数内容的前提下,通过@函数可以实现在函数前后自定义执行一些功能(大量 *** 作使用)
应用场景,编写网站时,有很多个页面都需要登录才能访问,可基于装饰器验证用户
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)