iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文详解如何创建自己的Python装饰器
  • 628
分享到

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

2024-04-02 19:04:59 628人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、@staticmethod2、自定义装饰器3、带参数的装饰器python装饰器在平常的Python编程中用到的还是很多的,在本篇文章中我们先来介绍一下python中最常使用的

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装饰器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文详解如何创建自己的Python装饰器

本文链接: https://www.lsjlt.com/news/120263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文详解如何创建自己的Python装饰器
    目录1、@staticmethod2、自定义装饰器3、带参数的装饰器python装饰器在平常的python编程中用到的还是很多的,在本篇文章中我们先来介绍一下python中最常使用的...
    99+
    2024-04-02
  • 一文教你Python如何创建属于自己的IP池
    目录开发环境模块使用如果安装python第三方模块如何配置pycharm里面的python解释器pycharm如何安装插件代理ip结构思路一. 数据来源分析二. 代码实现步骤代码开发...
    99+
    2024-04-02
  • 如何创建一个自己的bootstrap模板
    本篇内容介绍了“如何创建一个自己的bootstrap模板”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码...
    99+
    2024-04-02
  • 如何创建自己的第一个React 页面
    目录Rract是啥?背景 React脚手架JSX是什么Rract是啥? React 是用于构建用户界面的 JavaScript 库 构建用户界面. User Interfa...
    99+
    2024-04-02
  • 如何封装Python时间处理库创建自己的TimeUtil类
    本篇内容主要讲解“如何封装Python时间处理库创建自己的TimeUtil类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何封装Python时间处理库创建自己的TimeUtil类”吧!简介在日...
    99+
    2023-07-06
  • Python怎样手动编写一个自己的LRU缓存装饰器
    Python怎样手动编写一个自己的LRU缓存装饰器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。LRU缓存算法,指的是近期最少使用算法,大体逻辑就是淘汰最长时间没有用的那个缓存...
    99+
    2023-06-22
  • Python如何手动编写一个自己的LRU缓存装饰器的方法实现
    LRU缓存算法,指的是近期最少使用算法,大体逻辑就是淘汰最长时间没有用的那个缓存,这里我们使用有序字典,来实现自己的LRU缓存算法,并将其包装成一个装饰器。 1、首先创建一个my_c...
    99+
    2024-04-02
  • 详解如何构建自己的react hooks
    目录1. 常用的一个 hooks1.1 useState: 状态钩子1.2 useEffect: 副作用钩子1.3 useMemo 和 useCallback2. 实现几个自定义的 ...
    99+
    2024-04-02
  • Android如何创建自己的内容提供器
    小编给大家分享一下Android如何创建自己的内容提供器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!创建内容提供器的步骤前面已经提到过,如果想要实现跨程序共享数...
    99+
    2023-05-30
    android
  • Python学习之装饰器与类的装饰器详解
    目录装饰器装饰器的定义装饰器的用法类中的装饰器类的装饰器 - classmethod类的装饰器 - staticmethod类的装饰器 - property通过学习装饰器可以让我们更...
    99+
    2024-04-02
  • 在python中如何建立一个自己的包
    目录python如何建立一个自己的包一些概念如何建立(示例)导入自己写好的python包实例总结python如何建立一个自己的包 一些概念 模块:我们写的每个py都是一个模块包:模块...
    99+
    2023-02-17
    python建立包 python自己的包 python建立一个自己的包
  • 图文详解Python如何导入自己编写的py文件
    目录一. 想要实现的效果二. 实现的方法三. 进阶用法四. 使用_init_.py控制导入某文件夹时执行的操作总结一. 想要实现的效果 新建文件夹将自编模块集中管理 可在其它py文件...
    99+
    2024-04-02
  • 【创建FTP】如何在内网创建属于自己的FTP
    在学校里通常会有ftp,用于老师上传课件以及学习资料,让同学们去下载获取资料和作业,同时会按照分类去存放各系老师的资料。 这个ftp属于内网段ftp,同学们在学校不论有无网络,只要插上网线都可以...
    99+
    2023-09-01
    服务器 前端 网络
  • 一篇文章带你了解Python中的装饰器
    目录前言Python 中的装饰器是什么语法糖使用 Python 装饰器修改函数行为使用 Python 装饰器对函数进行计时使用 Python 装饰器将有用信息记录到终端Web app...
    99+
    2024-04-02
  • Docker创建自己的镜像与上传流程详解
    目录引入了解Docker的资源隔离和主机模式创建 centos7 容器部署mysql5.7创建Docker Hub仓库生成镜像提交镜像引入 在部署毕节服务器时遇到了个问题: &ems...
    99+
    2024-04-02
  • Python装饰器常用的创建方式是什么
    这篇文章主要介绍“Python装饰器常用的创建方式是什么”,在日常操作中,相信很多人在Python装饰器常用的创建方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python装饰器常用的创建方式是什么...
    99+
    2023-06-30
  • 如何搭建一个自己的云服务器
    要搭建自己的云服务器,您需要以下步骤:1. 选择云服务提供商:选择可靠的云服务提供商。根据您的需求和预算选择合适的服务商。2. 注册账号并购买服务:根据您选择的云服务提供商,注册一个账号并购买适合您需求的云服务器服务。您可以根据预算和需...
    99+
    2023-08-09
    云服务器
  • 详解如何利用Python装饰器优化代码
    目录什么是装饰器装饰器的应用计时器装饰器缓存装饰器类型检查装饰器日志装饰器授权装饰器拓展高阶函数包装器总结本文将带你深入探讨装饰器的应用,包括计时器装饰器和缓存装饰器等的实现。通过这...
    99+
    2023-05-19
    Python装饰器优化代码 Python装饰器优化 Python装饰器
  • gitee中如何创建自己的代码仓库
    本篇内容介绍了“gitee中如何创建自己的代码仓库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注册Gitee账号首先,需要在Gitee网站...
    99+
    2023-07-05
  • 一文带你探寻Python中的装饰器
    目录什么是装饰器闭包函数最简单的装饰器为什么需要装饰器装饰器用法不是用语法糖调用带参数的装饰器总结试官: 听说你熟悉python,那么你能简单阐述一下python的装饰器、生成器以及...
    99+
    2023-05-15
    Python装饰器原理 Python装饰器使用 Python装饰器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作