📅  最后修改于: 2023-12-03 15:34:13.547000             🧑  作者: Mango
在 Python 中,装饰器是一种可以动态地修改类或函数行为的语法糖。它们通常用于向一个函数或方法添加额外的功能,而无需修改它们的源代码。Python 装饰器可以使用任何可调用的对象来实现,包括函数、类和实例方法。
在 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 代码的关键工具。