W
AI-Wiki
CONCEPT

Python装饰器

核心定义

Python装饰器是Python生态下的元编程语法特性,属于Python学习笔记 摘要中要求掌握的核心进阶语法,以@符号作为显式标记,可在完全不修改原函数、类的源代码的前提下,为其扩展额外的通用功能,大幅减少重复代码,提升项目的复用性与可维护性。

核心运行逻辑

装饰器本质是接收可调用对象(函数/方法/类)作为参数的高阶函数,核心运行逻辑为:将装饰器封装的功能逻辑附加到其下方紧邻定义的函数/方法/类上,程序运行时调用被装饰的对象时,会优先执行装饰器注入的额外逻辑,再执行原对象的原有逻辑,全程无需修改原对象的代码实现。 部分带参数的装饰器为多层嵌套的高阶函数,可通过Python关键字参数(kwargs)接收自定义配置参数,实现更灵活的功能定制。

常用内置装饰器

Python原生内置了三类高频使用的装饰器,专门用于类成员的行为定义:

  1. @property:可将类方法伪装为属性,调用时无需加括号,示例:原本调用形式为user.get_age()的方法,添加该装饰器后可直接通过user.age访问返回值。
  2. @classmethod:用于定义绑定类本身的类方法,第一个参数固定为cls(指代类本身而非类实例),无需实例化类即可调用,可直接访问类属性、调用其他类方法。
  3. @staticmethod:用于定义与类、类实例均无绑定关系的静态方法,无需接收selfcls参数,本质是挂载在类命名空间下的普通函数。

第三方库扩展装饰器

Python生态的大量第三方库均基于装饰器特性实现扩展能力,典型代表为Pydantic@field_validator装饰器:

  • 功能:可绑定指定的Pydantic模型类字段,实现自定义字段校验逻辑
  • 运行规则:Pydantic会自动将装饰器绑定的字段的实际值作为参数传入校验方法,无需开发者手动传参,示例:@field_validator("input_variables")修饰的校验方法,会自动接收input_variables字段的取值作为第一个参数完成校验。

使用边界与注意事项

  1. 装饰器默认会覆盖被装饰对象的元信息(如__name____doc__),可通过标准库functools.wraps装饰器装饰包装函数解决该问题
  2. 支持多个装饰器叠加使用,装饰顺序为从上到下依次绑定,执行顺序为从下到上依次执行
  3. 无参数装饰器使用时无需加括号(如@decorator),带自定义参数的装饰器使用时必须加括号传入参数(如@decorator(type="str")

相关条目