装饰器 是 Python 中的一种高级特性,用于在不改变函数内部代码的前提下,增强或修改函数的行为。装饰器实际上是一个高阶函数,它接受一个函数作为参数,并返回一个增强或修改后的函数。
要定义一个装饰器,可以创建一个函数,该函数接受另一个函数作为参数,并返回一个新的函数。
def my_decorator(func):
def wrapper():
print("Before the function runs")
func()
print("After the function runs")
return wrapper
你可以通过 @decorator_name
语法糖来应用装饰器。
@my_decorator
def say_hello():
print("Hello!")
say_hello()
上述代码输出:
Before the function runs
Hello!
After the function runs
注意:@my_decorator
等效于 say_hello = my_decorator(say_hello)
。
如果需要装饰器处理带参数的函数,可以在 wrapper
函数中使用 *args
和 **kwargs
来捕获所有位置参数和关键字参数。
def my_decorator(func):
def wrapper(*args, **kwargs):
print(f"Arguments passed to the function: {args} {kwargs}")
return func(*args, **kwargs)
return wrapper
@my_decorator
def add(a, b):
return a + b
result = add(3, 4)
print(f"Result: {result}")
上述代码输出:
Arguments passed to the function: (3, 4) {}
Result: 7
装饰器可以在很多场景下使用,如下是一些常见的应用场景:
接下来我们将创建一个基于命令行的任务管理工具,该工具使用装饰器来增强某些功能,并实现任务的增删查功能,并支持导入导出任务列表。
import json
import os
# 装饰器:日志记录
def log_action(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print(f"Action: {func.__name__} | Args: {args} | Result: {result}")
return result
return wrapper
class TaskManager:
def __init__(self):
self.tasks = []
@log_action
def add_task(self, task):
self.tasks.append(task)
return f"Task '{task}' added."
@log_action
def delete_task(self, task):
if task in self.tasks:
self.tasks.remove(task)
return f"Task '{task}' deleted."
return f"Task '{task}' not found."
@log_action
def list_tasks(self):
return self.tasks
@log_action
def export_tasks(self, filename):
with open(filename, 'w') as file:
json.dump(self.tasks, file)
return f"Tasks exported to '{filename}'."
@log_action
def import_tasks(self, filename):
if os.path.exists(filename):
with open(filename, 'r') as file:
self.tasks = json.load(file)
return f"Tasks imported from '{filename}'."
return f"File '{filename}' not found."
def main():
manager = TaskManager()
while True:
print("\nTask Manager")
print("1. Add task")
print("2. Delete task")
print("3. List tasks")
print("4. Export tasks")
print("5. Import tasks")
print("6. Exit")
choice = input("Choose an option: ")
if choice == "1":
task = input("Enter task: ")
print(manager.add_task(task))
elif choice == "2":
task = input("Enter task to delete: ")
print(manager.delete_task(task))
elif choice == "3":
print("Tasks:", manager.list_tasks())
elif choice == "4":
filename = input("Enter filename to export: ")
print(manager.export_tasks(filename))
elif choice == "5":
filename = input("Enter filename to import: ")
print(manager.import_tasks(filename))
elif choice == "6":
print("Goodbye!")
break
else:
print("Invalid choice. Please try again.")
if __name__ == "__main__":
main()
将上述代码保存为 task_manager.py
,在命令行执行以下命令运行:
python task_manager.py