装饰器-python

简介: 装饰器

装饰器是一种Python语言特性,可以动态地修改类或函数的行为。在Python中,函数和类都可以作为一等公民被传递、返回或赋予变量,成为一等公民最重要的就是能够在运行时动态创建函数和类。

让我们从最基本的例子开始,然后一步步扩展。

首先,我们定义一个名为 add 的函数,它将两个数字相加并返回结果:

def add(x, y):
    return x + y

print(add(2, 3))  # 输出 5

这是一个非常普通的函数。我们现在想要为该函数添加一些额外的功能,例如每次调用该函数时都记录一下运行时间。

我们可以通过以下方式来手动添加记录时间的代码:

import time

def add(x, y):
    start_time = time.time()
    result = x + y
    end_time = time.time()
    print("函数add的运行时间为:", end_time - start_time)
    return result

print(add(2, 3))  # 输出 5 和 "函数add的运行时间为:xxx"

代码中我们导入了 time 模块,然后在函数调用前记录了起始时间,函数调用结束后又记录了一个结束时间,两者相减得到运行时间,并打印出来。

但是这种方式有一些缺点,这需要手动修改每个函数的代码,这样很快就会变得繁琐,同时也会影响函数的可读性。此时,装饰器就可以发挥作用。

我们定义一个名为 timed 的装饰器函数,函数的作用是计算包装函数的运行时间并输出执行结果和运行时间。

import time

# 定义装饰器
def timed(function):

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = function(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {function.__name__}的运行时间为:{end_time - start_time:.4f} 秒。")
        return result

    return wrapper

# 使用装饰器
@timed
def add(x, y):
    return x + y

print(add(2, 3))  # 输出 5 和 "函数add的运行时间为:xxx"

我们看一下 timed 函数的实现,它定义了一个内部函数 wrapper,并返回该函数。wrapper 函数接收任意数量的位置和关键字参数,并且调用被装饰的函数,获得它的结果。然后Wrapper计算并打印该函数的运行时间,并通过 return 语句返回函数的结果。

使用装饰器时,我们可以使用 @ 符号将装饰器名称放在要装饰的函数之前,如 @timed

现在我们可以用同样的方式来装饰其他函数,以自动记录它们的运行时间:

@timed
def sub(x, y):
    return x - y

print(sub(10, 3))  # 输出 7 和 "函数sub的运行时间为:xxx"

当我们调用 add()sub() 时,就会默认使用 timed() 函数装饰,输出函数运行的时间。

这就是一个装饰器的实现方式,通过装饰器,我们可以不修改原函数,来动态地添加一些额外的功能,达到代码复用的目的。

相关文章
|
16天前
|
数据安全/隐私保护 开发者 Python
深入浅出Python装饰器
【8月更文挑战第4天】装饰器在Python中是一个既强大又神秘的功能,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过浅显易懂的语言和实例,带领读者一步步揭开装饰器的神秘面纱,理解其背后的原理,并学会如何在实际开发中应用它们。
|
19天前
|
测试技术 开发者 Python
Python 编程中的装饰器深入解析
【8月更文挑战第1天】本文将通过实例和代码演示,深入探讨 Python 中装饰器的概念、用法和高级应用。我们将从基础开始,逐步过渡到如何自定义装饰器,并展示其在日志记录、性能测试等场景下的实际用途。文章最后还将讨论装饰器的常见误区和最佳实践。
Python 装饰器“高级”使用
本文聚焦两个有意思的点 1. 无参和有参装饰器。 @deco vs @deco(arg1,arg2)。 2. 多层装饰器场景。
|
20天前
|
缓存 Python
代码之美:探索Python中的装饰器
【7月更文挑战第31天】在编程的世界里,装饰器就像是一位神奇的艺术家,它能够为我们的代码添加额外的功能,而不改变原有代码的结构。本文将带领你走进Python的装饰器世界,通过实例学习如何创造和使用装饰器,让你的代码更加优雅和高效。
37 18
|
16天前
|
Python
探索Python中的装饰器:从入门到实践
【8月更文挑战第4天】在Python的世界中,装饰器是一把双刃剑,它既能美化代码,又能提升效率。本文将带你一探究竟,通过实例学习如何定义、使用以及深入理解装饰器背后的原理。我们将一起揭开这层神秘的面纱,让装饰器成为你编程工具箱中的又一利器。
32 9
|
16天前
|
测试技术 开发者 Python
揭秘Python中的装饰器:从入门到精通
【8月更文挑战第4天】装饰器,在Python中是一块神奇的“画布”,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文将通过实际的代码示例,带你一探究竟,从基础使用到高级技巧,逐步揭开装饰器的神秘面纱。
|
14天前
|
测试技术 开发者 Python
翻天覆地!Python装饰器,如何让代码起死回生?
【8月更文挑战第6天】在软件开发领域,提高代码的质量始终是核心目标之一。Python作为一种功能丰富的高级语言,提供了多种手段来实现这一目标,装饰器便是其中之一。本文通过问答形式,深入解析了装饰器的概念、基本语法及其实现机制。装饰器允许在不改变原函数的基础上添加新功能,其基本语法为使用`@`符号后跟装饰器函数名。此外,还探讨了装饰器如何通过增强代码的模块性和灵活性来提升整体质量,并举例说明了装饰器在类方法中的应用。总之,装饰器是一种强大的工具,可以帮助开发者以更简洁、模块化的方式扩展功能,同时保持代码的整洁和可维护性。
26 3
|
17天前
|
设计模式 开发者 Python
探索Python中的装饰器:从基础到高级应用
【8月更文挑战第3天】本文将深入探讨Python编程中一个强大而灵活的特性——装饰器。我们将从理解装饰器的基本概念开始,通过实际代码示例,逐步展示如何创建和使用它们。文章旨在揭示装饰器背后的魔法,帮助开发者解锁其在代码重用和扩展性方面的潜力。
|
19天前
|
Python
探索Python中的装饰器:从入门到实践
【8月更文挑战第1天】本文将带领读者深入理解Python装饰器的概念,并透过代码示例展示如何利用装饰器来增强函数功能。我们将一起探索装饰器的工作原理,学习如何自定义装饰器,并探讨其在实战中的应用。通过阅读本篇文章,你将能够掌握装饰器的使用,为你的Python项目增添强大的功能。
|
19天前
|
测试技术 Python
Python中的装饰器:简化你的代码
【8月更文挑战第1天】在编程的世界中,我们常常追求的是简洁与高效。Python作为一种高级编程语言,其独特的特性之一就是“装饰器”。装饰器不仅能够让我们以简洁的方式修改函数的行为,还能在不改变原函数定义的前提下增加额外的功能。本文将通过实例介绍如何在Python中使用装饰器,以及如何自定义装饰器来解决实际问题。让我们一起探索装饰器的奥秘,让你的代码更加优雅。