包含python的函数修饰器的词条

python函数修饰符@的使用python函数修饰符@ 修饰符 ‘@’符号用作函数修饰符是python2.4新增加python的函数修饰器的功能python的函数修饰器,修饰符必须出现在函数定义前一行python的函数修饰器,不允许和函数定义在同一行 。也就是说@A def f(): 是非法的 。只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类 。一个修饰符就是一个函数,它将被修饰的函数做为参数 , 并返回修饰后的同名函数或其它可调用的东西 。本质上讲,装饰符@类似于 回调函数  , 把其它的函数(暂且称为目的参数,后面紧接着的函数)作为自己的入参,在目的函数执行前 , 执行一些自己的操作,比如:计数、打印一些提示信息等,然后返回目的函数 。下面列举一个简单的例子 。
创建函数修饰符的规则:
(1)修饰符是一个函数
(2)修饰符取被修饰函数为参数
(3)修饰符返回一个新函数
(4)修饰符维护被维护函数的签名
例子1:被修饰函数不带参数
运行结果:
例子2:使用functools模块提供的修改函数属性的方法wraps
运行结果:
可见test1的函数名称变了,如果某些代码用到就会出问题,可以使用functools模块提供的修改函数属性的方法wraps
运行结果:
例子3:被修饰函数带参数
运行结果:
例子4:修饰符带参数,需要比上面例子多一层包装
运行结果:
如何理解Python装饰器内裤可以用来遮羞python的函数修饰器,但是到python的函数修饰器了冬天它没法为我们防风御寒,聪明python的函数修饰器的人们发明了长裤,有了长裤后宝宝再也不冷了,装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效 。
再回到我们的主题
装饰器本质上是一个Python函数,它可以让其python的函数修饰器他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象 。它经常用于有切面需求的场景,比如python的函数修饰器:插入日志、性能测试、事务处理、缓存、权限校验等场景 。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用 。概括的讲 , 装饰器的作用就是为已经存在的对象添加额外的功能 。
先来看一个简单例子:
def foo():
print('i am foo')
现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:
def foo():
print('i am foo')
logging.info("foo is running")
bar()、bar2()也有类似的需求 , 怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志  , 日志处理完之后再执行真正的业务代码
def use_logging(func):
logging.warn("%s is running" % func.__name__)
func()
def bar():
print('i am bar')
use_logging(bar)
逻辑上不难理解,但是这样的话,我们每次都要将一个函数作为参数传递给use_logging函数 。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行bar(),但是现在不得不改成use_logging(bar) 。那么有没有更好的方式的呢?当然有,答案就是装饰器 。
简单装饰器
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
def bar():
print('i am bar')
bar = use_logging(bar)

推荐阅读