首页 > 编程语言 >深入理解Python中的装饰器

深入理解Python中的装饰器

时间:2024-12-05 11:04:31浏览次数:6  
标签:函数 Python 深入 decorator func print 装饰 def

前言

作为一名程序员,我们常常会遇到需要重复使用的代码段。为了提高代码的可读性和重用性,Python引入了装饰器(Decorator)这一强大的工具。装饰器可以在不修改函数源代码的情况下,为函数添加新的功能。本文将详细讲解Python中装饰器的使用方法及其实现原理。

什么是装饰器?

装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。装饰器通常用于增强或修改现有函数的功能。

def decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

在上面的例子中,decorator 就是一个装饰器,它接受一个函数 func 并返回一个新的函数 wrapper。在 wrapper 内部,我们可以在调用 func 之前和之后执行一些额外的操作。

使用装饰器

使用装饰器非常简单,只需要在函数定义前加上 @decorator 即可。

@decorator
def say_hello():
    print("Hello!")

say_hello()

运行上面的代码会输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

带参数的装饰器

如果装饰器本身也需要接受参数,可以使用嵌套函数来实现。

def repeat(num_times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                func(*args, **kwargs)
        return wrapper
    return decorator

使用这个装饰器时,可以指定重复执行函数的次数:

@repeat(3)
def say_hello():
    print("Hello!")

say_hello()

输出结果将是:

Hello!
Hello!
Hello!

装饰器与内置函数

有时候我们需要装饰内置函数,比如 print。这时可以使用 functools.wraps 来保持被装饰函数的元数据不变。

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

这样,即使我们装饰了内置函数,也不会丢失其原有的属性和方法。

类装饰器

除了函数装饰器,Python还支持类装饰器。类装饰器的用法与函数装饰器类似,只是它接受的是一个类而不是一个函数。

def class_decorator(cls):
    cls.new_method = lambda self: print("This is a new method.")
    return cls

使用类装饰器:

@class_decorator
class MyClass:
    def existing_method(self):
        print("This is an existing method.")

obj = MyClass()
obj.existing_method()
obj.new_method()

输出结果将是:

This is an existing method.
This is a new method.

总结

装饰器是Python中一种非常灵活且强大的工具,它可以帮助我们在不改变原有代码结构的情况下,增加新的功能或修改现有功能。通过合理使用装饰器,我们可以大大提高代码的可读性和可维护性。希望本文对你理解和使用Python中的装饰器有所帮助。

标签:函数,Python,深入,decorator,func,print,装饰,def
From: https://blog.csdn.net/qq_51700102/article/details/144258845

相关文章

  • 【最新原创毕设】基于SpringBoot的网上报修平台+94800(免费领源码)可做计算机毕业设计JA
    摘要随着信息技术的快速发展和普及,高校宿舍管理面临着诸多挑战与机遇。传统的宿舍管理模式,如手工记录报修信息、纸质文档管理等,已无法满足现代高校对效率和便捷性的需求。因此,开发一套高效、智能的网上报修平台显得尤为重要。基于springBoot的网上报修平台的设计和实现正......
  • python带翻页blbl视频爬虫程序代码QZQ
    importsubprocessdefdownload_bilibili_video(video_url):try:#使用you-get下载视频,-o指定输出目录(这里是当前目录)subprocess.run([‘you-get’,‘-o’,‘.’,video_url],check=True)print(“视频下载成功!”)exceptsubprocess.CalledProcessErrorase:print......
  • centos7 python3.9.10 报错 No module named _ssl
    配置openssltar-zxvfopenssl-1.1.1w.tar.gzcdopenssl-1.1.1w/./config--prefix=/usr/local/openssl--openssldir=/usr/local/opensslmakemakeinstallmv/usr/bin/openssl/usr/bin/openssl_backupln-s/usr/local/openssl/bin/openssl/usr/bin/opensslln-s/......
  • Python 编程入门教程
    Python是一种广泛使用的高级编程语言,以其代码的可读性、简洁性和强大的库支持而闻名。Python的设计哲学强调代码的可读性和简单性,这使得它成为初学者和专业人士学习编程的理想选择。Python应用广泛,从网站开发到数据科学、人工智能、自动化脚本等,几乎涵盖了所有编程领域。Py......
  • Python 中文编码
    如何用Python输出 "Hello,World!",英文没有问题,但是如果你输出中文字符 "你好,世界" 就有可能会碰到中文编码问题。Python文件中如果未指定编码,在执行过程会出现报错:#!/usr/bin/pythonprint("你好,世界")以上程序执行输出结果为:File"test.py",line2SyntaxErro......
  • Python全栈之旅:从零基础到精通的详细教程系列开启进阶之路
    前言:在信息技术飞速发展的今天,掌握编程语言的运维工程师与那些尚未涉足编程领域的运维工程师,仿佛生活在两个截然不同的世界。本博主深感这一鸿沟之深远,因此决定倾力打造一系列详尽至极的Python从零到精通教程,旨在帮助更多运维人员跨越这一技术壁垒。本系列教程将分为三大阶段,每个......
  • Python Web 开发:FastAPI 依赖注入与中间件应用
    PythonWeb开发:FastAPI依赖注入与中间件应用目录......
  • Python实战:长短期记忆网络(LSTM)
    假设有某只股票一段时间内的每日收盘价如下表所示:日期收盘价(单位:元)2024-01-01100.02024-01-02102.02024-01-03105.02024-01-04103.02024-01-05108.02024-01-06110.02024-01-07109.02024-01-08112.02024-01-09115.02024-01-10113.0importnumpyasnpimportmatplotlib.pyp......
  • 计算机毕业设计基于Python的股票预测模型系统
    收藏关注不迷路!!......
  • Python 浏览器自动化新利器:DrissionPage,让网页操作更简单!
    Python浏览器自动化新利器:DrissionPage,让网页操作更简单!文章目录Python浏览器自动化新利器:DrissionPage,让网页操作更简单!......