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

Python装饰器函数:用法和示例

发布时间:2023-05-20 09:33:13

Python装饰器是Python语言提供的一种特殊语法,用于修改函数或类的行为。装饰器函数可以接受一个函数作为参数,然后返回一个新的函数,该新函数可以包装原函数的行为,从而改变该函数的功能。本文将介绍Python装饰器函数的用法和示例。

用法

Python装饰器函数可以用来完成以下任务:

1. 实现“切面编程”(Aspect-Oriented Programming,AOP):Python装饰器可以对函数进行动态修改,添加额外功能,例如:日志、缓存、性能调优等。

2. 避免重复代码:Python装饰器可以将需要在多个函数中重复使用的代码提取出来,使代码更加简洁、易读。

3. 实现代码分离:Python装饰器可以将不同功能的代码划分到不同的函数中,使得程序更加模块化。

4. 实现函数自动调用:Python装饰器可以在函数执行前或执行完毕后自动调用其它函数,如:注册、注销、验证权限等。

下面是一个简单的装饰器实现,它可以记录函数执行时间:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__} took {(end-start)*1000:.2f}ms to run')
        return result
    return wrapper

@time_it
def some_function():
    # some code

以上代码定义了一个函数time_it,它接受另一个函数作为参数,并修改该函数的行为,然后返回一个新的函数。这个新函数被称为装饰器函数,它接收任意数量的位置和命名参数\*args**kwargs,并返回原始函数的调用结果。在some_function上加上@time_it修饰符后,some_function将被修改为执行时间记录版本。

示例

下面是一些Python装饰器示例。

1. 计算函数执行时间

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} took {(end-start)*1000:.6f}ms")
        return result
    return wrapper

@timer
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

factorial(20)

以上代码定义了一个工具函数timer,它被用来记录函数的执行时间。通过加入修饰器@timer修饰器,factorial函数将被扩展和修改为返回其执行时间和结果。

2. 用户验证

import getpass

def login_required(func):
    def wrapper(*args, **kwargs):
        username = input("Username: ")
        password = getpass.getpass("Password: ")
        if username == "admin" and password == "123":
            return func(*args, **kwargs)
        else:
            return "Access denied"
    return wrapper

@login_required
def admin_panel():
   print("Welcome to admin panel")

admin_panel()

以上代码定义了一个装饰器函数login_required,它强制要求用户输入用户名和密码以验证权限,只有当用户输入正确的用户名和密码时才允许访问后端。将@login_required修饰符添加到admin_panel函数,该函数就被修改为只有在用户提供了正确的用户名和密码时才能够被访问。

3. 记录函数调用次数

def counter(func):
    def wrapper(*args, **kwargs):
        wrapper.count += 1
        return func(*args, **kwargs)
    wrapper.count = 0
    return wrapper

@counter
def foo():
    print("Hello, world!")

foo()
foo()
foo()
print(f"foo function was called {foo.count} times")

以上代码使用counter工具函数定义了一个装饰器函数@counter,它可以统计函数被调用的次数。将修饰器添加到一个函数中,然后运行该函数,并打印调用次数。

结论

Python装饰器函数是一种强大的语法结构,可以修改函数和类的行为,使用并发编程、创建跨站脚本和大规模应用程序时非常有用。装饰器简化了代码开发并使代码更加简洁和可读。装饰器具有高度的灵活性,可以很容易地扩展和修改,以满足不同的需求。