装饰器是一种以函数为输入参数的函数,其可是实现原函数的功能扩展。适应于日志记录、耗时分析等功能。本文将对函数装饰器进行细致的分析与讲解。
P1、装饰器函数定义
在Python中,装饰器和函数定义类似,但其进行了函数的嵌套,并在输入和返回值方面进行了调整。一个简单的装饰器结构,如下:
装饰器的定义上就是一个函数在内部嵌套另一个函数。
P2、装饰器函数使用
装饰器使用只需要将装饰器的名称放到被装饰函数定义前一行,并在装饰器函数前加@符号即可。如下:
做一个演示:
# 创建一个装饰器,名称为outerdef outer(func): def inner(*args,**kwargs): print('装饰前的代码。') r = func(*args,**kwargs) print('装饰后的代码。') return r return inner# 用装饰器装饰函数 @outerdef myfunc(): print('我是函数')# 运行函数 myfunc()
P3、装饰器函数的参数
上面讲的装饰器函数中,装饰器函数传入的参数是函数名,是没有自己的参数传入的,只有被装饰的参数传入。那装饰器函数如何传递参数呢?在Python通过在装饰器外面再套一层函数实现。
使用方法示意图,和无参数类似,只是这里需要加上参数了:
做一个演示:
# 创建一个装饰器,名称为ex_outer,支持装饰器的参数传递 def ex_outer(paras): def outer(func): def inner(*args,**kwargs): print('装饰前的代码。') print(f'输出的参数为{paras=}') r = func(*args,**kwargs) print('装饰后的代码。') return r return inner return outer# 用装饰器装饰函数 @ex_outer("I’m ex_outer")def myfunc(): print('我是函数')# 运行函数 myfunc()
输出:
装饰前的代码。输出的参数为paras='I’m ex_outer'我是函数装饰后的代码。
P4、内置装饰器
实际上,在Python中有很三个主要的内置装饰器供我们使用。主要有@staticmethod、@classmethod、 @property,它主要用于改变类的特性。前两个装饰器,可以使类方法当函数一样用(无需类实例化),最后那个装饰器是让类方法当做属性使用。
# 自定义类 class mycls(): @staticmethod def static_method(): print('静态方法') @classmethod def cls_method(cls): print('类方法') @property def name(self): print('属性')# 使用类被装饰的方法 mycls.static_method() # 静态方法,访问时不需要实例化类mycls.cls_method() # 类方法 ,访问时不需要实例化类mycls().name # 类属性 ,访问时当做实例化类的属性访问,不再是方法。
这里的内置装饰器,实际上是一种类方法装饰器,依然属于函数装饰器一类。在Python中,还有一种装饰器叫类装饰器,它以类作为输入(不是函数/方法),可以实现类的功能扩充。但由于字数限制,本文仅做函数装饰器的讲解与演示,至于类装饰器就留给小伙伴们自行研究(整体逻辑想通,但需注意类新增属性和方法的处理问题)。
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。