首页 > 编程语言 >浅析python中装饰器原理

浅析python中装饰器原理

时间:2023-04-23 13:58:18浏览次数:34  
标签:函数 python 装饰 ff 日志 浅析 def log

一、什么叫装饰器?

装饰器(decorator)的本质是一个函数,它接收一个函数作为参数,并返回一个被装饰过后的函数

二、装饰器的作用?

在不修改被修饰过函数的代码和和调用方式的情况下,给被装饰函数增加额外的功能

三、装饰器的应用场景?

插入日志、性能测试、事务处理、缓存、权限校验等场景

四、下面主要介绍函数装饰器

1.不带参数的装饰器
# 修饰函数不传参数
def log(fn):  # 装饰器‘log’本身就是函数,传入了一个函数‘fn’作为参数
    def ff():  # 修饰函数---起到修饰作用
        print('你好')
        fn()
        return ff  # 返回值为一个函数

@log
def f1():
    print('hello')
    
# 调用函数
f1() 

# 返回值
你好
hello

'''说明:
调用函数f1()时,先执行@log,最终会‘return’ff。
只需要看ff。ff做了个打印和调用函数fn(),调用函数fn()就等价于调用f1().
所以装饰器的本质就是把被修饰的函数‘f1’作为参数传入到修饰器'log'中,
然后在log下返回一个装饰函数‘ff’。然后在装饰函数'ff'中对被装饰函数‘f1’进行修饰和调用
'''

# 修饰函数传参数
def log(fn):  # 装饰器log
    def ff(*args, **kwargs):  # 修饰函数‘ff’传入了不定长参数
        print('开始打印日志了')
        result = fn(*args, **kwargs)  # 调用被装饰函数‘f2’,用变量‘result’接收
        print('打印日志了结束')
        return result  # 装饰函数ff返回值为被装饰函数‘f2’
    return ff


@log
def f2():
    print('日志')

# 调用函数‘f2’
f2()

# 返回值
开始打印日志了
日志
打印日志了结束


2.带参数的装饰器
def my_log(name):  # 参数‘name’
    def log(fn):
        def ff(*args, **kwargs):
            print(f'开始打印"{name}"日志了')
            result = fn(*args, **kwargs)
            print(f'打印"{name}"日志结束了')
            return result
        return ff
    return log  # 返回了一个装饰器


@my_log(name='错误')
def f3():
    print('日志')

# 调用函数
f3()

# 返回值
开始打印"错误"日志了
日志
打印"错误"日志结束了

'''
说明:带参数的装饰器和不带参数的装饰器差别不大,只是带参数的装饰器传入了参数,返回了一个装饰器
掌握了不带参数的装饰器,带参数的装饰器就是在不带参数的外面嵌套了一层函数,没有其他特殊的东西
'''

 

标签:函数,python,装饰,ff,日志,浅析,def,log
From: https://www.cnblogs.com/zy7941246/p/17346318.html

相关文章

  • Python_9 py文件导入和路径处理
    一、查缺补漏Python中两个值交换可以直接交换如:a,b=b,a冒泡就是从小到大排序,因为越到后越大自动导包也适用于自己创建的模块关于正斜杠和反斜杠https://www.cnblogs.com/yangjian319/p/4801675.html 5. 内置异常汇总https://www.cnblogs.com/nmb-musen/p/108......
  • Python之多进程与多线程
     1.1线程frommultiprocessingimportProcessdefshow(name):print("Processnameis"+name)if__name__=="__main__":proc=Process(target=show,args=('subprocess',))proc.start()proc.join()......
  • python 操作阿里云oss 对象存储上传下载文件
    python操作阿里云对象存储oss阿里云账号要有操作oss权限安装OSSSDKpipinstalloss2上传文件#-*-coding:utf-8-*-importoss2importos#阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控......
  • 给定一个正整数字符串,使用Python正则表达式在其千分位上添加逗号
    大家好,我是皮皮。一、前言前几天在Python黄金青铜群【沐】问了一个Python正则表达式的问题,这里拿出来给大家分享下。题目:给定一个正整数字符串,如12345678、345678,使用正则表达式在其千分位上添加逗号,如12,345,678、345,678。二、实现过程这里ChatGPT给了一个答案,可以使用......
  • python+playwright 学习-55 在docker 容器中运行playwright脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。镜像查看所有可用的图像标签ht......
  • python.h的使用方法
    Python.h是C语言中调用Python解释器的头文件,其中包含了许多常用的函数和数据类型。以下是Python.h中常用的方法和高级方法的示例代码:常用方法(1)Py_Initialize该函数用于初始化Python解释器。调用该函数后,才能使用Python解释器中的函数和模块。示例代码:#include<Python.h>i......
  • 图与网络——最小费用最大流Python实现
    最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以在流量最大的前提下,达到所用的费用最小的要求。如n辆卡车要运送物品,从A地到B地。由于......
  • python--多线程:锁 、全局锁、Queue队列以及线程池
    关于如何加锁,获取钥匙,释放锁:lock=threading.Lock():生成锁对象,全局唯一;lock.acquire():获取锁。未获取到会阻塞程序,直到获取到锁才会往下执行;lock.release():释放锁,归回后,其他人也可以调用;【注意事项】:lock.acquire()和lock.release()必须成对出现,否则就有可能造成......
  • 如何在交互式环境中执行Python程序
    相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行、命令行窗口运行、开发工具上运行等,其中在不同的操作平台上还互不相同。今天,小编讲些Python基础的内容,以Windows下交互式环境为依托,演示Python程序的运行。一般来说,顺利安装Python......
  • 手把手教你使用Python网络爬虫获取菜谱信息
    今日鸡汤一腔热血勤珍重,洒去犹能化碧涛。/1前言/    在放假时,经常想尝试一下自己做饭,下厨房这个网址是个不错的选择。    下厨房是必选的网址之一,主要提供各种美食做法以及烹饪技巧。包含种类很多。    今天教大家去爬取下厨房的菜谱,保存在world文档,方便日后制作自......