首页 > 编程语言 >python-装饰器

python-装饰器

时间:2022-09-18 22:55:48浏览次数:94  
标签:use logging 函数 python func foo 装饰

装饰器

什么是装饰器?

装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。

装饰器的作用?

它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

示例

  • foo为逻辑代码,use_logging添加日志
def use_logging(func):
    logging.warn("%s is running" % func.__name__)
    func()

def foo():
    print('i am foo')

use_logging(foo)

这样做逻辑上是没问题的,但是我们调用的时候不再是调用真正的业务逻辑 foo 函数,而是换成了 use_logging 函数,这就破坏了原有的代码结构,
现在我们不得不每次都要把原来的那个 foo 函数作为参数传递给 use_logging 函数,那么有没有更好的方式的呢?当然有,答案就是装饰器

简单装饰器

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
foo()                   # 执行foo()就相当于执行 wrapper()

use_logging 就是一个装饰器,它一个普通的函数,它把执行真正业务逻辑的函数 func 包裹在其中,看起来像 foo 被 use_logging 装饰了一样,use_logging 返回的也是一个函数,这个函数的名字叫 wrapper。

@语法糖

  • 使用@语法
def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()
    return wrapper

@use_logging
def foo():
    print("i am foo")

foo()

如上所示,有了 @ ,我们就可以省去foo = use_logging(foo)这一句了,直接调用 foo() 即可得到想要的结果。你们看到了没有,foo() 函数不需要做任何修改,只需在定义的地方加上装饰器,调用的时候还是和以前一样,如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。

参考

标签:use,logging,函数,python,func,foo,装饰
From: https://www.cnblogs.com/topbookcc/p/16706154.html

相关文章

  • python爬虫入门笔记(随便记记,持续更新)
    准备:安装库pip3installbeautifulsoup4apt-getinstallpython-lxmlpip3installparse 一、获得从baidu.com中能够跳转到的页面(的链接)importrequests......
  • Python 类
    Class对象类对象支持两种操作:属性引用和实例化。实例对象实例对象有两种有效的属性名称:数据属性和方法。数据属性,不需要声明,像局部变量一样,将在第一次被赋值时产生方......
  • 类装饰器
    2022-09-18 类装饰器的定义:使用一个类作为一个装饰器,在类里面对已有函数添加其他功能。类装饰器使用的一个实例:1classMyDecorator(object):2def__ini......
  • 带有参数的装饰器
    2022-09-18带有参数的装饰器的实质:因为装饰器是不能在带有参数,所以要定义带有参数的装饰器应该换一种思路。在装饰器的外面套一个函数,使用该函数返回这个装饰器。带......
  • Python面向对象+unittest框架(存档)
    面向对象基本的介绍面向对象是一个编程思想(写代码的套路)编程思想:1.面向过程2.面向对象以上两种都属于写代码的套路(方法),最终目的都是为了将代码书写出来,只不过过......
  • python实训2
    test3-1print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")number=int(input("请输入您认为符合条件的数:"))ifnumber%3==2andnumber%5==3andnumb......
  • 使用多个装饰器
    2022-09-18多个装饰器使用的实例:1#定义一个装饰器2defmake_p(func):3print("执行装饰器make_p")45definner():6#对已有函数增加......
  • 【利用Python进行edf格式的肌电处理的一些过程记录】-2022/09
    (1)获取原肌电数据,生成图片1.使用的库:mne2.肌电数据的格式:edfdefShow_Information(file):raw=read_raw_edf(file,preload=True)info=raw.info......
  • python实验报告(第三周)
    实验3:流程控制语句一、实验目的和要求1、了解Python的程序结构形式和嵌套语句的格式;2、掌握if、if…else、if…elif…else选择语句的使用;3、掌握条件表达式和while、fo......
  • 编译原理:python编译器--运行时机制
    python的运行时机制的核心--python对象机制的设计理解字节码的执行过程用GDB跟踪执行一个简单的示例程序,它只有一行:“a=1”。对应的字节码如下。其中,前两行指令实现......