Python 装饰器

person smartzeng    watch_later 2024-08-14 20:18:44
visibility 194    class Python    bookmark 专栏

Python 装饰器

1. 装饰器的定义与使用

装饰器 是 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

2. 装饰器的应用场景

装饰器可以在很多场景下使用,如下是一些常见的应用场景:

  • 日志记录:自动记录函数的调用信息。
  • 权限校验:在函数执行前验证用户权限。
  • 性能分析:计算函数执行时间。
  • 缓存:缓存函数的计算结果以提高性能。

3. 基于命令行的任务管理工具

接下来我们将创建一个基于命令行的任务管理工具,该工具使用装饰器来增强某些功能,并实现任务的增删查功能,并支持导入导出任务列表。

任务管理工具代码示例
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()
工具功能说明
  1. 任务管理:可以添加、删除、列出任务。
  2. 导入导出:可以将任务列表导出到文件,也可以从文件导入任务列表。
  3. 日志记录:使用装饰器记录每次操作的日志,包括操作名称和参数。
运行方式

将上述代码保存为 task_manager.py,在命令行执行以下命令运行:

python task_manager.py

总结

  • 装饰器 是用于增强或修改函数行为的高效工具,适用于日志记录、权限校验等场景。
  • 通过创建一个基于命令行的任务管理工具,你可以应用 Python 的装饰器特性来增强功能,同时实现任务的增删查导入导出功能。
评论区
评论列表
menu