装饰器

简介: 【8月更文挑战第1天】

Python装饰器是一种高阶函数,它们可以修改或增强函数的行为。以下是对Python装饰器的总结,包括它们的用途、使用时机以及好处,并附上代码示例。

为什么使用装饰器:

  1. 增加函数功能:在不修改原有函数代码的情况下增加新的功能。
  2. 代码复用:避免重复编写具有共性的代码。
  3. 分离关注点:将与函数主要功能无关的逻辑(如日志记录、性能测试、事务处理、权限校验等)分离出来。

什么时候使用装饰器:

  • 当需要对多个函数应用相同的功能时。
  • 当需要动态地修改函数的行为时。
  • 当需要在不破坏原有函数的基础上增加额外的处理逻辑时。

装饰器的好处:

  1. 提高代码的可读性和可维护性:通过减少重复代码,使代码更加清晰。
  2. 增加代码的灵活性:可以容易地添加或移除装饰器。
  3. 降低模块间的耦合度:装饰器提供了一种解耦的方法,使得代码更加模块化。

代码示例:

基础装饰器使用:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

带参数的装饰器:

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                value = func(*args, **kwargs)
            return value
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}!")

greet("World")

输出:

Hello World!
Hello World!
Hello World!

装饰器工厂:

def decorator_with_args(decorator_arg):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Debug level is {decorator_arg}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@decorator_with_args(decorator_arg=5)
def some_function():
    print("Function is executing.")

some_function()

输出:

Debug level is 5
Function is executing.

装饰器应用多个:

def debug(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Debug level: {level}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

def log_call():
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Function {func.__name__} is called with {args} {kwargs}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@debug(level=1)
@log_call
def add(x, y):
    return x + y

result = add(5, 3)

输出:

Function add is called with (5, 3) {}
Debug level: 1
8
目录
相关文章
装饰器:装饰器为主,闭包和高阶函数为辅
装饰器:装饰器为主,闭包和高阶函数为辅
|
8月前
|
设计模式
设计模式之装饰器 Decorator
设计模式之装饰器 Decorator
55 1
|
8月前
|
JavaScript
03_装饰器
03_装饰器
73 1
|
存储 缓存 关系型数据库
Python装饰器1-闭包与函数装饰器
闭包与函数装饰器:被装饰函数不带参数、被装饰函数带参数、装饰器带参数,装饰器的调用
Python装饰器1-闭包与函数装饰器
|
JSON 数据格式
装饰器的实际应用
使用装饰器模式改造slf4j打印json格式日志
774 0
装饰器的实际应用
|
开发者 Python
装饰器详解|学习笔记
快速学习装饰器详解
|
Python
Python编程:decorator装饰器
Python编程:decorator装饰器
138 0
|
设计模式 JavaScript 前端开发
2021你要知道的前端装饰器(Decorator)
2021你要知道的前端装饰器(Decorator)
685 0