返回

Python 装饰器入门

后端

Python 装饰器简介

装饰器是一种强大的 Python 特性,它允许你在不修改函数或类本身的情况下修改函数或类的行为。装饰器通过将其他函数作为参数来实现,并返回一个新的函数或类。这个新的函数或类具有原始函数或类的行为,以及装饰器添加的额外功能。

函数装饰器

函数装饰器是应用于函数的一种装饰器。函数装饰器的语法如下:

@decorator
def function_name(parameters):
    # function body

其中,@decorator 表示装饰器,function_name 是被装饰的函数,parameters 是函数的参数,# function body 是函数的主体。

例如,以下代码演示了如何使用函数装饰器来记录函数的运行时间:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"Function {func.__name__} took {end - start} seconds to run.")
        return result
    return wrapper

@timer
def calculate_factorial(n):
    if n == 0:
        return 1
    else:
        return n * calculate_factorial(n-1)

calculate_factorial(10)

输出:

Function calculate_factorial took 0.0009980201721191406 seconds to run.

在这个例子中,timer 函数是一个装饰器,它接受一个函数作为参数并返回一个新的函数。这个新的函数在执行被装饰的函数之前和之后打印一条消息,记录函数的运行时间。

类装饰器

类装饰器是应用于类的一种装饰器。类装饰器的语法如下:

@decorator
class ClassName:
    # class body

其中,@decorator 表示装饰器,ClassName 是被装饰的类,# class body 是类的主体。

例如,以下代码演示了如何使用类装饰器来添加一个日志记录功能到所有类:

import logging

def log_class(cls):
    logging.info(f"Class {cls.__name__} created.")
    return cls

@log_class
class MyClass:
    pass

MyClass()

输出:

INFO:root:Class MyClass created.

在这个例子中,log_class 函数是一个装饰器,它接受一个类作为参数并返回一个新的类。这个新的类在创建时会打印一条消息,记录类的名称。

装饰器的应用

装饰器有广泛的应用,包括:

  • 记录函数或类的行为
  • 缓存函数或类的方法的结果
  • 验证函数或类的参数
  • 添加安全检查到函数或类中
  • 简化代码

避免代码重复(DRY)

装饰器可以帮助你避免代码重复(DRY)。例如,如果你想在多个函数中添加日志记录功能,你可以使用一个装饰器来实现,而不是在每个函数中重复相同的代码。

代码的解耦

装饰器可以帮助你实现代码的解耦。例如,如果你想把日志记录功能从你的业务逻辑中分离出来,你可以使用一个装饰器来实现,而不是把日志记录代码嵌入到你的业务逻辑中。

总结

装饰器是 Python 中一种强大的特性,它允许你在不修改函数或类本身的情况下修改函数或类的行为。装饰器可以用于记录函数或类的行为、缓存函数或类的方法的结果、验证函数或类的参数、添加安全检查到函数或类中、简化代码、避免代码重复(DRY)和实现代码的解耦。