📜  python 装饰器 *args **kwargs - Python (1)

📅  最后修改于: 2023-12-03 15:34:13.547000             🧑  作者: Mango

Python 装饰器 *args **kwargs

介绍

在 Python 中,装饰器是一种可以动态地修改类或函数行为的语法糖。它们通常用于向一个函数或方法添加额外的功能,而无需修改它们的源代码。Python 装饰器可以使用任何可调用的对象来实现,包括函数、类和实例方法。

*args 和 **kwargs

在 Python 中,*args 和 **kwargs 是可变参数列表的语法。当调用函数时,*args 将把参数打包成一个元组,而 **kwargs 将把参数打包成一个字典。

装饰器语法

Python 装饰器通常使用@符号来调用,例如:

@my_decorator
def my_function():
    pass

这等同于以下代码:

def my_function():
    pass

my_function = my_decorator(my_function)

因此,装饰器可以在不修改函数源代码的情况下修改它们的行为。

使用
简单的装饰器

以下是一个简单的装饰器示例,它记录了函数的调用时间:

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} seconds to run.")
        return result
    return wrapper

@time_it
def my_function():
    time.sleep(2)
    print("Function complete.")

my_function()

输出:

Function complete.
my_function took 2.000450849533081 seconds to run.
多个装饰器

可以同时使用多个装饰器来修改函数行为:

def foo_decorator(func):
    def wrapper(*args, **kwargs):
        print("Starting foo.")
        func(*args, **kwargs)
        print("Ending foo.")
    return wrapper

def bar_decorator(func):
    def wrapper(*args, **kwargs):
        print("Starting bar.")
        func(*args, **kwargs)
        print("Ending bar.")
    return wrapper

@foo_decorator
@bar_decorator
def my_function():
    print("Function complete.")

my_function()

输出:

Starting foo.
Starting bar.
Function complete.
Ending bar.
Ending foo.
类装饰器

装饰器不仅可以用于函数和方法,还可以用于类:

def my_class_decorator(cls):
    class NewClass:
        def __init__(self, *args, **kwargs):
            self.instance = cls(*args, **kwargs)

        def __getattr__(self, attr):
            return getattr(self.instance, attr)

    return NewClass

@my_class_decorator
class MyClass:
    def __init__(self, message):
        self.message = message

    def say_hello(self):
        print(self.message)

my_class = MyClass("Hello, world!")
my_class.say_hello() # Output: Hello, world!
总结

Python 装饰器在 Python 编程中是不可或缺的一部分。它们可用于添加额外功能、修改对象的行为和元信息、以及实现更多高级 Python 功能。在实践中,装饰器是编写高质量、条理清晰的 Python 代码的关键工具。