首页 > 编程知识 正文

Python常见的两种装饰器

时间:2023-11-22 16:24:04 阅读:307715 作者:IOBH

装饰器在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__方法来实现对函数或者类的装饰。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。