头图

Python 中的装饰器是一种特殊类型的函数,它们允许你修改其他函数的功能。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。使用装饰器可以在不修改原有函数代码的情况下增加额外的功能,这使得装饰器在实现诸如日志记录、性能测试、事务处理、缓存、权限校验等方面非常有用。

1.基本的装饰器

查看my_decorator

2.使用带参数的装饰器

这个例子中的 greet 函数会打印三次 "Hello ('Alice', '小明')",因为它被装饰为重复执行三次。

3.装饰器的实际应用

装饰器广泛应用于实现跨切面编程,比如:

日志记录:自动记录函数的调用详情。
性能测试:测量和报告函数执行时间。
事务处理:确保函数内的操作作为一个整体执行,如在数据库操作中。
权限验证:检查执行某个函数前用户是否有足够的权限。
装饰器是 Python 高级编程中非常强大的工具,能够使代码更加干净、优雅而且可重用。

4.代码详情

# -*- coding: utf-8 -*-
# 无参数装饰器
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper


# 有参数装饰器,在装饰器前面添加一层函数
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)

            return result
        return wrapper
    return decorator_repeat


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


@repeat(num_times=3)
def greet(*args, **kwargs):
    print(f"Hello {args}")


if __name__ == '__main__':
    say_hello()
    # 输出:
    # Something is happening before the function is called.
    # Hello!
    # Something is happening after the function is called.

    greet("Alice", 'xiaoming', book='python')
    # 输出
    # Hello ('Alice', '小明')
    # Hello ('Alice', '小明')
    # Hello ('Alice', '小明')

5. 注

在 Python 中,args 和 *kwargs 是两种用于函数定义中,处理不定数量参数的方式。它们允许你创建可接受任意数量参数的函数,无论是位置参数还是关键字参数。下面是详细说明:

*args
args 是用来将不确定数量的位置参数传递给一个函数。它是一个约定用法,args 只是一个变量名,你可以使用任何其他变量名(比如 params),但最佳实践是使用 args。这些参数在函数内部被处理为一个元组。

使用示例:

def print_args(*args):
    for arg in args:
        print(arg)

print_args('Hello', 'world', 123, 'Python')

这个函数可以接受任意数量的参数,*args 将所有传递的位置参数收集到一个名为 args 的元组中。

**kwargs
kwargs 允许你将不确定数量的关键字参数传递给函数。kwargs 代表 "keyword arguments",它在函数内部被处理为一个字典。与 *args 类似,kwargs 也不是必须的名字,你可以使用任何有效的变量名(比如 options),但最佳实践是使用 kwargs。

使用示例:

def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_kwargs(name='Alice', age=25, language='Python')

这个函数可以接受任意数量的关键字参数,**kwargs 将所有关键字参数收集到一个名为 kwargs 的字典中,其中字典的键是参数的名称,值是参数的值。

组合使用 args 和 *kwargs
你可以在同一个函数中同时使用 args 和 *kwargs 来接受任意类型和数量的参数:

def function_example(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

function_example(1, 2, 3, a='Hello', b='World')

输出:

args: (1, 2, 3)
kwargs: {'a': 'Hello', 'b': 'World'}

这种组合允许函数同时接受位置参数和关键字参数,其中位置参数以元组的形式存在于 args 中,而关键字参数以字典的形式存在于 kwargs 中。

这些功能使得 Python 函数非常灵活,能够处理多种不同的调用情形,特别是在你需要创建功能丰富的 API 或进行高级参数处理时非常有用。


周周架构师
292 声望409 粉丝