我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中装饰器代码是怎么样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中装饰器代码是怎么样的

这篇文章主要为大家展示了“Python中装饰器代码是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中装饰器代码是怎么样的”这篇文章吧。

    一、理解装饰器

    所有东西都是对象(函数可以当做对象传递)
    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

    def function_one():    print("测试函数")#可以将一个函数赋值给一个变量,比如foo =function_one #这里没有在使用小括号,因为我们并不是在调用function_one函数,而是在将它放在foo变量里。foo()'''测试函数Process finished with exit code 0'''

    闭包的概念:

    1)函数嵌套

    2)内部函数使用外部函数的变量

    3)外部函数的返回值为内部函数

    示例:

    def outer_function(message):    def inner_function():        print(message)    return inner_functionfunc = outer_function("你好")func() #你好

    二、装饰器原型

    装饰器的作用就是 不修改源代码以及原函数调用方式的情况下 给原函数增加新的功能。

    #将函数作为参数传给另一个函数def decorator_function(original_function):    def wrapper_function():    print('wrapper executed this before {}'.format(original_function.__name__))        original_function()    return wrapper_function    '''    返回wrapper_function而不是wrapper_function();这是因为当你把一对小括号放在后面,这个函数就会执行;    然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。'''def display():    print('display function ran')decorator_display = decorator_function(display)decorator_display()

    运行结果:

    wrapper executed this before displaydisplay function ranProcess finished with exit code 0

    1、不带参数的装饰器

    def decorator_function(original_function):    def wrapper_function():        print('wrapper executed this before {}'.format(original_function.__name__))        original_function()    return wrapper_function@decorator_functiondef display():  #等价于display =decorator_function(display)    print('display function ran')display()

    运行结果:

    wrapper executed this before display
    display function ran

    Process finished with exit code 0

    2.带参数的被装饰的函数

    def decorator_function(original_function):    def wrapper_function(*args,**kwargs):        print('wrapper executed this before {}'.format(original_function.__name__))        original_function(*args,**kwargs)    return wrapper_function@decorator_functiondef display():    print('display function ran')@decorator_functiondef display_info(name,age):    print('display_info ran with arguments ({},{})'.format(name,age))display()print('='*50)display_info('Michal',20)

    运行结果:

    wrapper executed this before display
    display function ran
    ==================================================
    wrapper executed this before display_info
    display_info ran with arguments (Michal,20)

    Process finished with exit code 0

    运行如下代码会出现一个问题

    def decorator_function(original_function):    def wrapper_function(*args,**kwargs):        print('wrapper executed this before {}'.format(original_function.__name__))        original_function(*args,**kwargs)    return wrapper_function@decorator_functiondef display():    print('display function ran')@decorator_functiondef display_info(name,age):    print('display_info ran with arguments ({},{})'.format(name,age))display_info = decorator_function(display_info)print(display_info.__name__)

    wrapper_function

    Process finished with exit code 0

    输出的应该是display_info,这里的函数被wrapper_function替代了,重写了我们函数的名字和注释文档(docstring)。Python中可以使用functools.wraps来解决这个问题。

    from functools import wrapsdef decorator_function(original_function):    @wraps(original_function)    def wrapper_function(*args,**kwargs):        print('wrapper executed this before {}'.format(original_function.__name__))        original_function(*args,**kwargs)    return wrapper_function@decorator_functiondef display():    print('display function ran')@decorator_functiondef display_info(name,age):    print('display_info ran with arguments ({},{})'.format(name,age))display_info = decorator_function(display_info)print(display_info.__name__)

    运行结果:

    display_info

    Process finished with exit code 0

    3.带参数的装饰器

    在函数中嵌入装饰器

    from functools import wrapsdef logit(logfile='out.log'):    def logging_decorator(func):        @wraps(func)        def wrapped_function(*args, **kwargs):            log_string = func.__name__ + " was called"            print(log_string)            # 打开logfile,并写入内容            with open(logfile, 'a') as opened_file:                # 现在将日志打到指定的logfile                opened_file.write(log_string + '\n')            return func(*args, **kwargs)        return wrapped_function    return logging_decorator@logit()def myfunc1():    passmyfunc1()# Output: myfunc1 was called# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串@logit(logfile='func2.log')def myfunc2():    passmyfunc2()# Output: myfunc2 was called# 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串

    4.使用类作为装饰器

    class myDecorator(object):     def __init__(self, f):         print("inside myDecorator.__init__()")         f() # Prove that function definition has completed     def __call__(self):         print("inside myDecorator.__call__()")  @myDecorator def aFunction():     print("inside aFunction()")  print("Finished decorating aFunction()")  aFunction()

    运行结果:

    inside myDecorator.__init__()inside aFunction()Finished decorating aFunction()inside myDecorator.__call__()Process finished with exit code 0

    被装饰后的函数aFunction()实际上已经是类myDecorator的对象。当再调用aFunction()函数时,实际上就是调用类myDecorator的对象,因此会调用到类myDecorator的__call__()方法。

    因此使用类作为装饰器装饰函数来对函数添加一些额外的属性或功能时,一般会在类的__init__()方法中记录传入的函数,再在__call__()调用修饰的函数及其它额外处理。

    class entryExit(object):     def __init__(self, f):         self.f = f     def __call__(self):         print("Entering", self.f.__name__)         self.f()         print("Exited", self.f.__name__)  @entryExit def func1():     print("inside func1()")  @entryExit def func2():     print("inside func2()")  func1() func2()

    运行结果:

    Entering func1
    inside func1()
    Exited func1
    Entering func2
    inside func2()
    Exited func2

    Process finished with exit code 0

    5.使用对象作为装饰器

    空参:

    from functools import wrapsclass decorator_class:    def __init__(self):        print('执行decorator_class类的__init__()方法')    def __call__(self, original_function):        print('执行decorator_class类的__call__()方法')        @wraps(original_function)        def wrapped_function(*args, **kwargs):            print('call method executed this before {}'.format(original_function.__name__))            print('执行' + original_function.__name__ + '()')            original_function(*args, **kwargs)            print(original_function.__name__ + '()执行完毕')        return wrapped_function@decorator_class()def display_info(name,age):    print('display_info ran with arguments ({},{})'.format(name,age))display_info('Michael',20)

    运行结果如下:

    执行decorator_class类的__init__()方法
    执行decorator_class类的__call__()方法
    call method executed this before display_info
    执行display_info()
    display_info ran with arguments (Michael,20)
    display_info()执行完毕

    Process finished with exit code 0

    带参数:

    from functools import wrapsclass decorator_class:    def __init__(self,arg1, arg2):        print('执行decorator_class类的__init__()方法')        self.arg1 =arg1        self.arg2=arg2    def __call__(self, original_function):        print('执行decorator_class类的__call__()方法')        @wraps(original_function)        def wrapped_function(*args, **kwargs):        print('执行wrapped_function()')            print('call method executed this before {}'.format(original_function.__name__))            print('装饰器参数:', self.arg1, self.arg2)            print('执行' + original_function.__name__ + '()')            original_function(*args, **kwargs)            print(original_function.__name__ + '()执行完毕')        return wrapped_function@decorator_class('Hello', 'World')def display_info(name,age):    print('display_info ran with arguments ({},{})'.format(name,age))display_info('Michael',20)

    运行结果如下:

    执行decorator_class类的__init__()方法
    执行decorator_class类的__call__()方法
    执行wrapped_function()
    call method executed this before display_info
    装饰器参数: Hello World
    执行display_info()
    display_info ran with arguments (Michael,20)
    display_info()执行完毕

    Process finished with exit code 0

    示例2:

    from functools import wrapsclass logit(object):    def __init__(self, logfile='out.log'):        self.logfile = logfile    def __call__(self, func):        @wraps(func)        def wrapped_function(*args, **kwargs):            log_string = func.__name__ + " was called"            print(log_string)            # 打开logfile并写入            with open(self.logfile, 'a') as opened_file:                # 现在将日志打到指定的文件                opened_file.write(log_string + '\n')            # 现在,发送一个通知            self.notify()            return func(*args, **kwargs)        return wrapped_function    def notify(self):        # logit只打日志,不做别的        pass@logit()def myfunc1():    pass

    6.多层装饰器的嵌套

    #装饰器1def decorator1(func):    #定义装饰之后的函数    def wrapper1():        # 装饰器1        print('1-----装饰1之前')        # 调用基本函数        func()        # 扩展功能2        print('1-----装饰1之后')    return wrapper1#装饰器2def decorator2(func):    #定义装饰之后的函数    def wrapper2():        # 装饰器2        print('2-----装饰2之前')        # 调用基本函数        func()        # 扩展功能2        print('2-----装饰2之后')    return wrapper2#基本函数@decorator2   # 第二步:test = decorator2(eat) = test2@decorator1   # 第一步:test = decorator1(eat)  = test1def test():    print('测试')#调用函数test()

    运行结果:

    2-----装饰2之前
    1-----装饰1之前
    测试
    1-----装饰1之后
    2-----装饰2之后

    Process finished with exit code 0

    以上是“Python中装饰器代码是怎么样的”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Python中装饰器代码是怎么样的

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

    下载Word文档

    猜你喜欢

    Python中装饰器代码是怎么样的

    这篇文章主要为大家展示了“Python中装饰器代码是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中装饰器代码是怎么样的”这篇文章吧。一、理解装饰器所有东西都是对象(函数可以
    2023-06-25

    Python装饰器怎么用代码实现

    这篇“Python装饰器怎么用代码实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python装饰器怎么用代码实现”文章吧
    2023-06-17

    Python代码中的装饰器很重要吗

    本篇内容介绍了“Python代码中的装饰器很重要吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 01什么是装饰器?要理解什么是装饰器,您首
    2023-06-15

    python装饰器代码的示例分析

    这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.装饰器通用模型def wrapper(fn): def inner(*args, **kwargs):
    2023-06-29

    python中装饰器指的是什么

    这篇文章将为大家详细讲解有关python中装饰器指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其
    2023-06-14

    Python中怎么使用装饰器装饰函数

    这篇文章将为大家详细讲解有关Python中怎么使用装饰器装饰函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。***个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco
    2023-06-17

    python中的迭代器,生成器与装饰器怎么用

    这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实
    2023-06-29

    python中的生成器、迭代器、装饰器怎么使用

    本篇内容介绍了“python中的生成器、迭代器、装饰器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、装饰器由于一个函数能实现一种
    2023-07-02

    python中装饰器的作用是什么

    本篇内容主要讲解“python中装饰器的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中装饰器的作用是什么”吧!装饰器的作用就是用一个新函数封装旧函数(是旧函数代码不变的情
    2023-06-20

    python中的装饰器怎么定义

    这篇文章主要介绍“python中的装饰器怎么定义”,在日常操作中,相信很多人在python中的装饰器怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中的装饰器怎么定义”的疑惑有所帮助!接下来
    2023-06-02

    Python中怎么使用装饰器来装饰函数

    在Python中,装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,可以在不修改原始函数代码的情况下添加额外的功能或逻辑。下面是一个简单的示例,演示如何使用装饰器来装饰函数:# 定义一个装饰器函数def m
    Python中怎么使用装饰器来装饰函数
    2024-03-12

    Python装饰器与类的装饰器怎么实现

    这篇“Python装饰器与类的装饰器怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python装饰器与类的装饰器怎么
    2023-06-29

    怎么在python中修饰带参数的装饰器

    本篇文章给大家分享的是有关怎么在python中修饰带参数的装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,
    2023-06-14

    python中@property装饰器怎么用

    这篇文章主要介绍python中@property装饰器怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、property的装饰器用法先简单上个小栗子说明:class property(fget=None,fse
    2023-06-29

    python中装饰器怎么使用

    这篇文章给大家分享的是有关python中装饰器怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、装饰器使用场景经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解
    2023-06-15

    Python代码风格是怎样的

    小编给大家分享一下Python代码风格是怎样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python主要用来做什么Python主要应用于:1、Web开发;2、
    2023-06-14

    Python装饰器的写法是什么

    这篇文章主要讲解了“Python装饰器的写法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python装饰器的写法是什么”吧!Hello,装饰器装饰器本质上是一个Python函数,它可
    2023-06-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录