Python装饰器:从基础到高级用法

原创
admin 4个月前 (05-31) 阅读数 143 #Python
文章标签 Python

<a target="_blank" href="https://blog.ithorizon.cn/tag/Python/"style="color:#2E2E2E">Python</a>装饰器:从基础到高级用法

1. 引言

Python中,装饰器是一种特殊类型的函数,它可以修改其他函数的行为或功能。装饰器的本质是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增长额外功能,装饰器的返回值也是一个函数对象。

2. 基础装饰器

基础装饰器是最易懂的装饰器形式,通常用于在不修改原函数代码的情况下,给函数添加一些额外的功能。例如,我们可以创建一个记录函数执行时间的装饰器:

import time

def timer_decorator(func):

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(f"{func.__name__} 运行时间:{end_time - start_time}秒")

return result

return wrapper

@timer_decorator

def my_function():

time.sleep(2)

my_function()

3. 带参数的装饰器

有时候,我们需要创建可以接受参数的装饰器。这可以通过定义一个返回装饰器的函数来实现。例如,我们可以创建一个可以通过不同日志级别记录信息的装饰器:

def log_decorator(log_level):

def decorator(func):

def wrapper(*args, **kwargs):

if log_level == "INFO":

print(f"INFO: 正在调用 {func.__name__}")

elif log_level == "DEBUG":

print(f"DEBUG: 正在调用 {func.__name__}")

result = func(*args, **kwargs)

return result

return wrapper

return decorator

@log_decorator("INFO")

def my_function():

pass

my_function()

4. 类装饰器

除了函数装饰器,Python还拥护类装饰器。类装饰器通过定义一个类,该类需要实现`__call__`方法,让类的实例可以像函数一样被调用。类装饰器可以更加灵活地处理装饰逻辑,并且可以更容易地维护状态。

class CountCalls:

def __init__(self, func):

self.func = func

self.num_calls = 0

def __call__(self, *args, **kwargs):

self.num_calls += 1

print(f"第 {self.num_calls} 次调用 {self.func.__name__}")

return self.func(*args, **kwargs)

@CountCalls

def my_function():

pass

my_function()

my_function()

5. 装饰器顺序

当一个函数被多个装饰器装饰时,装饰器的应用顺序是从下到上,即最接近函数定义的装饰器先被应用。这意味着,当你有多个装饰器时,你需要从内到外阅读它们。

6. 内置装饰器

Python提供了一些内置的装饰器,如`@staticmethod`、`@classmethod`和`@property`,这些装饰器用于改变方法的调用行为或为类添加属性。

7. 总结

装饰器是Python中的一个强劲特性,它允许我们以声明式的行为修改或强化函数的行为。无论是基础的函数装饰器,还是更纷乱的带参数装饰器和类装饰器,都能帮助我们编写出更加简洁和可维护的代码。掌握装饰器的使用,将使你的Python编程技能更上一层楼。


本文由IT视界版权所有,禁止未经同意的情况下转发

热门