Python中的装饰器:定义、使用与常见应用
Python中的装饰器是一种特殊的语法,用于修改或增强函数的功能,在不修改原代码的情况下,可以重复使用。装饰器本身是一个函数,接受一个函数作为参数,并返回修改后的函数。本文将介绍Python中装饰器的定义、使用与常见应用。
一、装饰器的定义
装饰器的定义实质上就是一个高阶函数,即一个函数接受一个函数作为参数,以修改该函数的功能或者为其增加额外的功能。
来看一个最简单的装饰器例子:
def handle(func):
def wrapper():
print("Begin")
func()
print('End')
return wrapper
def say_hello():
print("Hello world")
handle(say_hello)()
在上述代码中,handle 函数接受一个函数作为参数,然后返回一个匿名函数 wrapper。在 wrapper 函数中,对函数进行了装饰,即在执行 func 函数前后输出了 Begin 和 End 两个字符串。
在使用时,我们可以简单地调用 handle(say_hello)(),这样会输出以下结果:
Begin Hello world End
二、装饰器的应用
1. 计时器
装饰器经常用来实现一些常用的功能,比如计时器。在Python中,我们可以通过装饰器来计算一个函数的运行时间,例如:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("time used: ", end_time-start_time, "secs")
return result
return wrapper
@timer
def test_time():
time.sleep(2)
return True
test_time()
在上述代码中,定义了一个计时器装饰器,通过调用 time 模块中的 time()函数来获取时间信息。使用了装饰器 @timer 就可以将 test_time() 函数的运行过程计算出来。
2. 权限验证
另外一个常见的案例是权限验证。 比如,如果用户没有登录,在调用某些函数时需要进行一些校验操作。
def login(func):
def wrapper(*args, **kwargs):
username = input("Please input your name: ")
password = input("Please input your password: ")
if username == "admin" and password == "1234":
return func(*args, **kwargs)
else:
print("Login failed")
return wrapper
@login
def test_logged_function():
print("Welcome to the logged function")
test_logged_function()
在上述代码中,定义了一个命名为 login 的装饰器,该装饰器会根据输入的用户名和密码是否正确,决定是否调用被装饰函数 test_logged_function()。
3. 校验输入
装饰器还可以用于校验函数中的输入参数是否满足规则。使用装饰器可以减少代码的量,增加代码的可读性。
def validate(func):
def wrapper(*args, **kwargs):
if all(isinstance(i, int) for i in args):
return func(*args, **kwargs)
else:
print("Invalid input, expects integers")
return wrapper
@validate
def test_validate(a, b):
print(f"a + b = {a + b}")
test_validate(1, 2)
test_validate(1, "2")
在上述代码中,定义了一个装饰器 @validate,该装饰器会对输入参数进行校验,只有当所有参数都是整数时代码才会继续执行。
三、小结
装饰器能够给一种功能增加一些额外的特性,很好的体现了Python的动态性和灵活性。通过对函数的装饰器进行应用,可以大大减少代码繁琐度,增加代码的可读性。
