Python装饰器
渴望力量的哈士奇 人气:0通过学习装饰器可以让我们更好更灵活的使用函数,通过学会使用装饰器还可以让我们的代码更加优雅。
在我们的实际工作中,很多场景都会用到装饰器,比如记录一些日志、或者屏蔽一些不太合法的程序执行从而使我们的代码更加安全。
装饰器
什么是装饰器?虽然对这个次感到陌生,但是完全不需要担心。
首先,装饰器也是一种函数;只不过装饰器可以接收 函数 作为参数来传递。
并且可以通过 return 可以返回一个函数,装饰器通过接收一个函数,对它在装饰器内部进行处理、调用,并返回一个新的函数,同时还可以动态增强传入函数的功能。
装饰器整个流程是这样的:
- A函数是装饰器,B函数是A函数传入的参数。
- 将B函数在A函数中执行,在A函数中可以选择执行或不执行,也可以对B函数的结果进行二次加工处理。
接下来我们看看 装饰器长什么样子
def a(): def b(): print(helloworld) b() a() b()
a() 函数中书写了一个 b() 函数,并在 a() 函数中调用 b() 函数。是不是非常类似在类中定义一个局部函数并调用的例子?其实装饰器就是有些类似这样的操作,只不过被装饰器调用的函数是通过 参数 的形式传进去,并在 b() 函数中执行。
我们在定义完 a() 函数之后进行调用,可以正常处理。但是 b() 函数 是 a() 函数的局部函数 如果在外部调用会报错。(如上文中的第十行,就会报错)
装饰器的定义
示例如下:
def out(func_args): # 装饰器的第一层函数被称为 外围函数 , 'func_args' 为要处理的函数 def inter(*args, **kwargs): # 外围函数 的函数体内定义的函数被称为 内嵌函数 ;传入的参数为要处理的 func_args 函数的参数 # 这里我们并不知道 func_args 函数需要传入进来的参数是什么,所以目前写传入可变参数是比较合理的 return func_args(*args, **kwargs) # 在 内嵌函数 的函数体内调用 func_args 函数,并将可变参数传入 # 其实这里我们可以处理更多的逻辑; # 我们可以选择执行或者不执行,甚至可以func_args 函数的执行结果进行二次处理 return inter # 书写完 内嵌函数的业务之后,我们在 外围函数体内返回 内嵌函数 # 需要注意的是,这里是不执行的(因为没有加括号),这是装饰器的定义规则,是必不可少的 # 只有外围函数返回内嵌函数,才可以被之后的代码执行;(因为所有的业务都在内嵌函数中,不返回就无法执行调用)
装饰器的用法
在我们日常工作中,装饰器的使用方法有两种。
第一种:将被调用的函数直接作用为参数传入装饰器的外围函数括弧内;示例如下:
def a(func): def b(*args, **kwargs): return func(*args, **kwargs) return b def c(name): print(name) a(c)('Neo') # >>> 执行结果如下: # >>> Neo
第二种:将装饰器与被调用函数绑定在一起, @ 符号 + 装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可。示例如下:
def a(func): def b(*args, **kwargs): return func(*args, **kwargs) return b @a def c(name): print(name) c('Neo') # >>> 执行结果如下: # >>> Neo
最常用的装饰器用法为第二种。
现在我们构建一个 检查字符串类型的装饰器,加深一下对装饰器的理解。
def check_ok(func): def inner(*args, **kwargs): result = func(*args, **kwargs) if result == 'OK': return '传入的参数数据为:\'%s\'' % result else: return '传入的参数数据不为:\'OK\'' return inner @check_ok def test_str(data): return data result = test_str('OK') print(result) # >>> 执行结果如下: # >>> 传入的参数数据为:'OK' result = test_str('NO') print(result) # >>> 执行结果如下: # >>> 传入的参数数据不为:'OK'
加载全部内容