返回

Python装饰器:绝妙用法

后端

Python装饰器是一种强大的工具,它可以让你在不改变被装饰函数源代码的情况下修改函数的行为。这使得装饰器非常适合用来做一些事情,比如:

  • 计时函数的运行时间
  • 在函数执行前后打印日志信息
  • 为函数添加缓存功能
  • 为函数添加权限控制

Python装饰器语法

Python装饰器使用@符号来定义。装饰器函数必须放在被装饰函数的前面。例如:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Calling function:", func.__name__)
        result = func(*args, **kwargs)
        print("Function returned:", result)
        return result
    return wrapper

@my_decorator
def my_function(x, y):
    return x + y

在这个例子中,my_decorator函数是一个装饰器,它接受一个函数func作为参数,并返回一个新的函数wrapper。wrapper函数是实际的装饰器函数,它在调用func函数之前和之后执行一些额外的代码。

Python装饰器实例

这里有一些Python装饰器的实例:

  • 计时函数的运行时间
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("Function", func.__name__, "took", end - start, "seconds to run")
        return result
    return wrapper

@timer
def my_function(x, y):
    time.sleep(1)
    return x + y

my_function(1, 2)

这个装饰器将输出以下内容:

Function my_function took 1.0002102851867676 seconds to run
  • 在函数执行前后打印日志信息
import logging

def logger(func):
    def wrapper(*args, **kwargs):
        logging.info("Calling function:", func.__name__)
        result = func(*args, **kwargs)
        logging.info("Function returned:", result)
        return result
    return wrapper

@logger
def my_function(x, y):
    return x + y

my_function(1, 2)

这个装饰器将输出以下内容:

INFO: Calling function: my_function
INFO: Function returned: 3
  • 为函数添加缓存功能
import functools

def memoize(func):
    cache = {}

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

@memoize
def my_function(x, y):
    return x + y

my_function(1, 2)
my_function(1, 2)

这个装饰器将输出以下内容:

3
3
  • 为函数添加权限控制
def auth(role):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if current_user.role == role:
                return func(*args, **kwargs)
            else:
                raise PermissionError("You do not have permission to access this function")
        return wrapper
    return decorator

@auth("admin")
def my_function():
    return "Hello, admin!"

my_function()

这个装饰器将输出以下内容:

Hello, admin!

Python装饰器使用

Python装饰器非常容易使用。你只需要在函数前面加上@符号,然后加上装饰器函数的名称即可。例如:

@my_decorator
def my_function(x, y):
    return x + y

Python装饰器代码演示

以下是一些Python装饰器的代码演示:

# 计时函数的运行时间
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("Function", func.__name__, "took", end - start, "seconds to run")
        return result
    return wrapper

@timer
def my_function(x, y):
    time.sleep(1)
    return x + y

my_function(1, 2)

# 在函数执行前后打印日志信息
import logging

def logger(func):
    def wrapper(*args, **kwargs):
        logging.info("Calling function:", func.__name__)
        result = func(*args, **kwargs)
        logging.info("Function returned:", result)
        return result
    return wrapper

@logger
def my_function(x, y):
    return x + y

my_function(1, 2)

# 为函数添加缓存功能
import functools

def memoize(func):
    cache = {}

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

@memoize
def my_function(x, y):
    return x + y

my_function(1, 2)
my_function(1, 2)

# 为函数添加权限控制
def auth(role):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if current_user.role == role:
                return func(*args, **kwargs)
            else:
                raise PermissionError("You do not have permission to access this function")
        return wrapper
    return decorator

@auth("admin")
def my_function():
    return "Hello, admin!"

my_function()

这些代码演示了如何使用Python装饰器来做各种事情。你可以在自己的项目中使用这些装饰器来简化代码并提高代码的可读性。