使用装饰器(Decorator)改变函数的行为
发布时间:2023-12-03 20:06:32
装饰器是Python语言中的一种语法,它可以修改已有函数的行为,而无需修改函数本身的定义。装饰器的作用类似于给函数加上一个外壳,可以在执行函数之前或之后加入额外的功能逻辑。
使用装饰器可以实现很多功能,比如添加日志、计时、权限验证等。下面我们将以一个示例来说明如何使用装饰器改变函数的行为。
假设我们有一个简单的函数,用于计算一个数的平方:
def square(num):
return num ** 2
现在我们想给这个函数添加一个日志功能,即在函数被调用时打印相关信息。我们可以定义一个装饰器来实现这个功能:
def log_decorator(func):
# 定义内部函数,用于在调用被装饰的函数之前打印日志
def wrapper(*args, **kwargs):
print("日志:函数 {} 被调用。".format(func.__name__))
return func(*args, **kwargs)
return wrapper
上述代码定义了一个名为log_decorator的装饰器,它接受一个函数作为参数,并返回一个新的函数wrapper。wrapper函数用于在调用被装饰的函数之前打印日志,并最终执行被装饰的函数。
现在,我们可以使用@语法糖将装饰器应用到我们的函数上:
@log_decorator
def square(num):
return num ** 2
这样,每当调用square函数时,都会先打印一条日志信息,然后再执行函数本身。例如,执行square(5)会输出以下日志信息:
日志:函数 square 被调用。
除了添加日志功能,装饰器还可以实现其他功能,比如计时、权限验证等。下面是一个实现计时功能的装饰器示例:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("函数 {} 执行时间:{} 秒。".format(func.__name__, end_time - start_time))
return result
return wrapper
这个装饰器接受一个函数作为参数,并在调用被装饰的函数之前记录开始时间,之后记录结束时间并打印函数的执行时间。
使用这个装饰器可以很方便地给函数添加计时功能,例如:
@timer_decorator
def square(num):
time.sleep(1) # 模拟函数执行时间
return num ** 2
执行square(5)会输出如下信息:
函数 square 执行时间:1.0036704540252686 秒。
通过上述示例,我们可以看到,使用装饰器可以很方便地改变函数的行为,而无需修改函数本身的定义。这种方式可以使代码更加模块化和可维护,同时也提高了代码的重用性。
