python装饰器

python装饰器,第1张

python装饰器

不修改原函数的条件下,实现在函数执行前和执行后分别输出’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__)

总结:装饰器,在不修改原函数内容的前提下,通过@函数可以实现在函数前后自定义执行一些功能(大量 *** 作使用)

应用场景,编写网站时,有很多个页面都需要登录才能访问,可基于装饰器验证用户

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/732735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存