欢迎访问宙启技术站
智能推送

Python中的装饰器:定义、使用与常见应用

发布时间:2023-06-27 03:15:24

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 函数前后输出了 BeginEnd 两个字符串。

在使用时,我们可以简单地调用 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的动态性和灵活性。通过对函数的装饰器进行应用,可以大大减少代码繁琐度,增加代码的可读性。