一文详解如何创建自己的Python装饰器

 更新时间:2022年09月04日 09:09:04   作者:Python 集中营  
python装饰器在平常的python编程中用到的还是很多的,本篇文章中我们将来介绍一下python中最常使用的@staticmethod装饰器的使用,感兴趣的可以了解一下

python装饰器在平常的python编程中用到的还是很多的,在本篇文章中我们先来介绍一下python中最常使用的@staticmethod装饰器的使用。

之后,我们会使用两种不同的方式来创建自己的自定义python装饰器以及如何在其他地方进行调用。

1、@staticmethod

@staticmethod是python开发者经常用来在一个类中声明该函数是一个静态函数时使用到的装饰器,比如创建一个HelloWorld的python类,并且在其中使用该静态装饰器声明其中的函数。

class HelloWorld():
    def __init__(self):
        super(HelloWorld, self).__init__()

    @staticmethod
    def print_hello_world():
        print('welcome to hello world!')

@staticmethod装饰器一般是对于一些公共的函数,或是工具函数之类的函数进行声明,声明之后就不会将当前python类中的初始化变量信息等传入到该函数中,可以看到print_hello_world函数并没有self作为参数变量。

接下来可以在初始化@staticmethod声明的函数所在的类HelloWorld,并且调用print_hello_world函数。

hello_world = HelloWorld()
hello_world.print_hello_world()

会发现控制台直接打印出了welcome to hello world!这行字符串。

实际上在python中的函数上面加入装饰器只是为了在执行当前函数的逻辑之前去执行一些我们需要执行的业务功能,这样的操作我们通过自定义自己的装饰器也能够实现同样的效果。

2、自定义装饰器

其实,自定义装饰器的过程也比较简单,就是我们平常用到的函数或者python类的写法就能够实现。

自己实现装饰器主要有两种方式,一种是通过class类的方式来实现的,另外一种则是通过python函数嵌套的方式来实现的,下面我们先来通过第一种的方式来实现,也就是通过python类的方式来实现。

python类实现装饰器

用python类来实现装饰器时,必须明白一个知识点。python类中实际上默认有一个成员函数__call__,这个成员函数就是这个类被调用时的函数对象,若是需要自定义装饰器实际上就是在python类的__call__函数中来实现装饰器主要业务逻辑实现的。

class print_message(object):
    def __init__(self, function_):
        self.function_ = function_

    def __call__(self):
        # TODO:这里实际上是对传入的函数返回值进行的装饰,可以理解成是一种回调。
        print('装饰器,{}'.format(self.function_()))

注意:在下面这行代码块中一定要注意self.function_是一个函数对象,而self.function_()是一个函数返回值得效果。

print('装饰器,{}'.format(self.function_()))

这样,我们通过python类就已经实现了python装饰器的效果,使用一个函数来试验一下效果。

@print_message
def hello_world():
    return 'hello world!'

hello_world()

调用使用了@print_message装饰器的函数,它会返回我们预期的一个函数结果的打印。

# 装饰器,hello world!

python函数嵌套实现装饰器

上面的操作过程是通过重新定义了一个python类来实现装饰器的效果的,这里再使用函数嵌套的方式来实现。

因为,我们都知道在python中函数中再可以嵌套函数的,在函数中嵌套一个函数时上层的函数相对于子函数来说就是它的一个父级对象。

@print_message2
@print_message
def hello_world3():
    return 'hello world!'

hello_world3()

# 装饰器,hello world!
# 装饰器2,None

使用函数嵌套的方式同样实现了函数的装饰器的效果,那么思考一下若是有两个装饰器可以在同一个函数中使用吗?

多个装饰器调用

话不多说,为了证明两个装饰器能不能放到一个函数上面使用,我们直接试一下效果如何。

@print_message2
@print_message
def hello_world3():
    return 'hello world!'

hello_world3()

# 装饰器,hello world!
# 装饰器2,None

从返回结果来看,首先是两个装饰器都是执行了,从数据结果打印的顺序来看自定义的装饰器的执行顺序应该是从距离函数最近的装饰器开始执行的,也就是从下往上的顺序挨个执行该函数上面的装饰器的.

另外,装饰器2的结果为None,这是为什么呢?

因为,第一个装饰器执行的时候,它的参数应该是hello_world函数本身,但是当第二个装饰器执行的时候第一个装饰器并没有返回结果知识做了打印,这个时候第二个装饰器接收到的参数自然就是None了。

3、带参数的装饰器

说实话带参数的装饰器在python中我见到的不多,不多在java中几乎只要是装饰器都是可以加参数执行的。

还是来介绍一下,算是属于扩展知识吧,既然已经看到了这里,不妨再多掌握个小技能吧,哈哈~

我们使用pytgon嵌套的函数功能来实现这个带参数的装饰器吧,个人觉得这种方便一些。

def header(message):
    def decorator(function_):
        def wrapper():
            return '带参数的装饰器,参数:{0},{1}'.format(message, function_())
        return wrapper
    return decorator

@header('Python 集中营')
def hello_world4():
    return 'hello world!'

print(hello_world4())

# 带参数的装饰器,参数:Python 集中营,hello world!

OK,带参数的装饰器果然生效了,给@header加上参数@header(‘Python 集中营’),上面装饰器直接使用三层函数的嵌套来实现的。

第一层函数参数是我们需要自定义给装饰器传入的参数,第二层则是传入的已经添加了装饰器的函数本身,到了第三层才是真正的处理装饰器自己的业务逻辑的。

到此这篇关于一文详解如何创建自己的Python装饰器的文章就介绍到这了,更多相关Python装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你使用Python画棵圣诞树完整代码

    教你使用Python画棵圣诞树完整代码

    圣诞节快到了,今天小编通过代码画颗圣诞树,主要通过t.pensize(10) 修改画笔大小,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-12-12
  • Python实现矩阵转置的方法分析

    Python实现矩阵转置的方法分析

    这篇文章主要介绍了Python实现矩阵转置的方法,结合实例形式较为详细的分析了Python实现矩阵转置的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Python中的pprint模块

    Python中的pprint模块

    本文介绍了 Python中的pprint模块,pprint模块包含一个“美观打印机”,用于生成数据结构的一个美观的视图。格式化工具会生成数据结构的一些表示,不仅能够由解释器正确地解析,还便于人阅读。输出会尽可能放在一行上,分解为多行时会缩进,想了解具体内容请参考下文
    2021-11-11
  • python pandas时序处理相关功能详解

    python pandas时序处理相关功能详解

    这篇文章主要介绍了python pandas时序处理相关功能详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python 表达式和语句及for、while循环练习实例

    python 表达式和语句及for、while循环练习实例

    下面小编就为大家带来一篇python 表达式和语句及for、while循环练习实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 关于Python函数的定义和参数

    关于Python函数的定义和参数

    这篇文章主要介绍了关于Python函数的定义和参数,Python中的函数我们可以理解成是一种具有功能的包装块,也就是封装具有某一种功能的代码块,需要的朋友可以参考下
    2023-04-04
  • matplotlib相关系统目录获取方式小结

    matplotlib相关系统目录获取方式小结

    这篇文章主要介绍了matplotlib相关系统目录获取方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 基于SpringBoot构造器注入循环依赖及解决方式

    基于SpringBoot构造器注入循环依赖及解决方式

    这篇文章主要介绍了基于SpringBoot构造器注入循环依赖及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python实现批量图片格式转换

    python实现批量图片格式转换

    这篇文章主要为大家详细介绍了python实现批量图片格式转换的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 详解Python相关文件常见的后缀名

    详解Python相关文件常见的后缀名

    常见的 Python 文件后缀有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。本文给大家介绍Python相关文件常见的后缀名,感兴趣的朋友跟随小编一起看看吧
    2021-05-05

最新评论