装饰器在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