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

Python装饰器的使用方法及应用举例

发布时间:2023-06-24 15:52:29

Python装饰器是Python语言中一种非常实用的语法结构,可以将函数作为参数传入另一个函数,然后在不改变原函数定义的情况下,为原函数添加额外的功能。

Python装饰器的使用方法

Python装饰器的使用方法非常简单,只需要定义一个函数,这个函数需要接收一个函数作为参数,并返回一个新的函数即可。下面是一个简单的Python装饰器示例:

def my_decorator(func):
    def wrapper():
        print("Before the function is executed.")
        func()
        print("After the function is executed.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

这个示例中,定义了一个装饰器函数my_decorator,它接收一个函数参数func,定义了一个内部函数wrapper,在wrapper中执行了一些额外的操作,并在最后调用了原函数func。然后将wrapper函数返回。在原函数上方使用@my_decorator,就相当于对原函数进行了装饰。

通过运行上面的代码,我们可以得到以下输出:

Before the function is executed.
Hello!
After the function is executed.

Python装饰器的应用举例

下面是一些Python装饰器的常见应用举例:

1. 计时装饰器

计时装饰器可以帮助我们计算每个函数的执行时间。下面是一个计时装饰器的示例:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Function %s took %f seconds" % (func.__name__, end_time - start_time))
        return result
    return wrapper

@time_it
def my_function():
    time.sleep(1)

my_function()

2. 缓存装饰器

缓存装饰器可以帮助我们缓存一些函数的计算结果,避免重复计算。下面是一个缓存装饰器的示例:

def cache_it(func):
    cache = {}

    def wrapper(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]
    return wrapper

@cache_it
def calculate(a, b):
    print("Calculating...")
    return a + b

print(calculate(1, 2))
print(calculate(1, 2))

3. 认证装饰器

认证装饰器可以帮助我们对一些需要认证才能访问的函数进行授权。下面是一个认证装饰器的示例:

def authenticate(func):
    def wrapper(*args, **kwargs):
        username = input("Username: ")
        password = input("Password: ")
        if check_credentials(username, password):
            return func(*args, **kwargs)
        else:
            return "Access denied"
    return wrapper

@authenticate
def my_function():
    return "Sensitive data"

def check_credentials(username, password):
    if username == "admin" and password == "123456":
        return True
    else:
        return False

print(my_function())

通过这些示例,我们可以看到Python装饰器的强大功能。我们可以根据实际场景,自己编写装饰器,为函数添加自定义的功能。