Python 装饰器
Python 装饰器
1. 装饰器的定义与使用
装饰器 是 Python 中的一种高级特性,用于在不改变函数内部代码的前提下,增强或修改函数的行为。装饰器实际上是一个高阶函数,它接受一个函数作为参数,并返回一个增强或修改后的函数。
装饰器的定义
要定义一个装饰器,可以创建一个函数,该函数接受另一个函数作为参数,并返回一个新的函数。
python
def my_decorator(func):
def wrapper():
print("Before the function runs")
func()
print("After the function runs")
return wrapper装饰器的使用
你可以通过 @decorator_name 语法糖来应用装饰器。
python
@my_decorator
def say_hello():
print("Hello!")
say_hello()上述代码输出:
text
Before the function runs
Hello!
After the function runs注意:@my_decorator 等效于 say_hello = my_decorator(say_hello)。
带参数的装饰器
如果需要装饰器处理带参数的函数,可以在 wrapper 函数中使用 *args 和 **kwargs 来捕获所有位置参数和关键字参数。
python
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}")上述代码输出:
text
Arguments passed to the function: (3, 4) {}
Result: 72. 装饰器的应用场景
装饰器可以在很多场景下使用,如下是一些常见的应用场景:
- 日志记录:自动记录函数的调用信息。
- 权限校验:在函数执行前验证用户权限。
- 性能分析:计算函数执行时间。
- 缓存:缓存函数的计算结果以提高性能。
3. 基于命令行的任务管理工具
接下来我们将创建一个基于命令行的任务管理工具,该工具使用装饰器来增强某些功能,并实现任务的增删查功能,并支持导入导出任务列表。
任务管理工具代码示例
python
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,在命令行执行以下命令运行:
bash
python task_manager.py总结
- 装饰器 是用于增强或修改函数行为的高效工具,适用于日志记录、权限校验等场景。
- 通过创建一个基于命令行的任务管理工具,你可以应用 Python 的装饰器特性来增强功能,同时实现任务的增删查导入导出功能。