当前位置:首页>python>Python入门(番外篇):函数装饰器

Python入门(番外篇):函数装饰器

  • 2026-08-25 21:55:26
Python入门(番外篇):函数装饰器

装饰器是一种以函数为输入参数的函数,其可是实现原函数的功能扩展。适应于日志记录、耗时分析等功能。本文将对函数装饰器进行细致的分析与讲解。

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中,还有一种装饰器叫类装饰器,它以类作为输入(不是函数/方法),可以实现类的功能扩充。但由于字数限制,本文仅做函数装饰器的讲解与演示,至于类装饰器就留给小伙伴们自行研究(整体逻辑想通,但需注意类新增属性和方法的处理问题)。

☆☆☆ End ☆☆☆
转角  ·  遇见  ·  程序猿
-------------------------
那是一抹淡淡的微光

它是数字世界里的一把杀猪刀

却总能巧夺天工

它的世界是纯粹0、1组合

却总能创造无尽幻想

......

本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。

最新文章

随机文章