Python常见的两种装饰器

装饰器在Python中是非常常见且有用的概念,可以通过装饰器来对函数或者类进行扩展和修改,而不需要修改原始的函数或者类的代码。Python中常见的两种装饰器有函数装饰器和类装饰器。

一、函数装饰器

1、何为函数装饰器

函数装饰器是用于修改其他函数的功能的函数,它本质上是一个Python函数,它接受一个函数作为参数,并返回一个新的函数。

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 对原始函数进行修改或扩展的代码
        return original_function(*args, **kwargs)
    return wrapper_function

@decorator_function
def decorated_function():
    # 原始函数的代码
    pass

2、函数装饰器的应用

函数装饰器可以用于添加日志、计时等功能。例如,我们可以定义一个装饰器用于打印函数的运行时间:

import time

def timer_decorator(original_function):
    def wrapper_function(*args, **kwargs):
        start_time = time.time()
        result = original_function(*args, **kwargs)
        end_time = time.time()
        print(f"Function '{original_function.__name__}' ran in {end_time - start_time} seconds")
        return result
    return wrapper_function

@timer_decorator
def my_function():
    time.sleep(2)  # 模拟函数执行需要耗费的时间

my_function()

执行上述代码,输出结果为:

Function 'my_function' ran in 2.0001168251037598 seconds

二、类装饰器

1、何为类装饰器

类装饰器与函数装饰器类似,不同之处在于它是一个类而不是一个函数。类装饰器可以通过重新定义\_\_call\_\_方法来实现与函数装饰器相同的功能。

class DecoratorClass:
    def __init__(self, original_function):
        self.original_function = original_function
    
    def __call__(self, *args, **kwargs):
        # 对原始函数进行修改或扩展的代码
        return self.original_function(*args, **kwargs)

@DecoratorClass
def decorated_function():
    # 原始函数的代码
    pass

2、类装饰器的应用

类装饰器可以用于添加日志、权限验证等功能。例如,我们可以定义一个装饰器用于打印函数的运行日志:

class LogDecorator:
    def __init__(self, original_function):
        self.original_function = original_function
    
    def __call__(self, *args, **kwargs):
        print(f"Calling '{self.original_function.__name__}'")
        return self.original_function(*args, **kwargs)

@LogDecorator
def my_function():
    pass

my_function()

执行上述代码,输出结果为:

Calling 'my_function'

总结

函数装饰器和类装饰器是Python中常见的装饰器方式,它们可以方便地对函数或者类进行修改和扩展。函数装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数;类装饰器是一个类,它通过重新定义\_\_call\_\_方法来实现对函数或者类的装饰。

原创文章,作者:TCVE,如若转载,请注明出处:https://www.beidandianzhu.com/g/1623.html

(0)
TCVE的头像TCVE
上一篇 2024-12-17
下一篇 2024-12-17

相关推荐

  • 将图片复制到剪切板:Python实现

    在本文中,我们将详细介绍如何使用Python将图片复制到剪切板。我们将从多个方面对这个主题进行阐述,希望能帮助你理解和应用这一特性。 一、剪切板概述 剪切板是一个操作系统提供的内存…

    程序猿 2025-01-03
  • Python解析文件

    本文将从多个方面详细阐述Python解析文件的方法和技巧。 一、读取文件 1、使用open()函数打开文件: file = open(“file.txt”, “r”) 2、使用re…

    程序猿 2024-12-17
  • 如何使用Idle Python

    Idle Python是一款简单易用的Python开发环境,它集成了Python解释器和编码器,提供了丰富的开发工具和功能。本文将从多个方面详细介绍Idle Python的使用方法…

    程序猿 2025-01-18
  • NLP和Python教程

    本文将以NLP和Python教程为中心,通过多个方面的阐述,为您详细介绍NLP和Python的相关内容。 一、NLP概述 1、自然语言处理(NLP)是一门研究人类语言和计算机之间相…

    程序猿 2025-01-07
  • Python西安培训班

    Python西安培训班是一门针对初学者或有一定编程基础的人士的培训课程,旨在教授Python语言的基础知识和应用技巧。通过系统的学习和实践,学员能够掌握Python语法、数据结构、…

    程序猿 2024-12-31
  • 使用Python读取xlrd库实现Excel文件读取

    本文将详细介绍如何使用Python的xlrd库来读取Excel文件。我们将从不同的方面对xlrd进行阐述,以帮助读者快速上手。 一、安装xlrd库 首先,我们需要安装xlrd库,以…

    程序猿 2024-12-24
  • Python是开源还是闭源?

    Python是一种高级编程语言,具有简单易学、灵活多样的特点,广泛应用于软件开发、数据分析、人工智能等领域。关于Python是开源还是闭源的问题,我们可以从多个方面来进行详细的阐述…

    程序猿 2025-02-05
  • 广西Python培训班

    广西Python培训班是为想要学习Python编程语言的人提供的培训课程。本文将从多个方面详细介绍广西Python培训班的内容和优势。 一、培训课程设置 1、基础知识学习 广西Py…

    程序猿 2025-01-27
  • Python动态添加属性及方法

    本文将详细阐述Python中如何通过动态添加属性和方法来扩展现有的类或对象,并提供相关代码示例。 一、动态添加属性 1、使用setattr()函数 class Person: pa…

    程序猿 2024-12-19
  • 黑马python2019吾爱破解

    黑马python2019吾爱破解是一个综合性编程开发教学平台,主要面向Python编程语言爱好者和开发工程师。通过该平台,用户可以学习Python编程语言的基础知识、高级技巧以及实…

    程序猿 2025-01-06

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部