python-装饰器-简介

文章目录

  • 1.装饰器
    • 1.动态参数
    • 2.闭包
    • 3.@语法
    • 4.装饰器
  • 2.总结

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.总结

自己记性不太好,学了总忘记了,装饰器挺重要,为了防止自己忘记,还是专门写了一些东西

你可能感兴趣的:(python-其他类型,python,开发语言,后端)