Python中@符号与装饰器机制详解

山海之间
山海之间
发布时间:2026-10-13 | 6人浏览过
原创

本文详细解析Python中@符号作为装饰器的核心机制。通过四个代码示例,深入探讨@如何修饰函数及嵌套装饰器的执行流程。重点分析参数传递过程、函数调用顺序及返回值处理,帮助开发者理解装饰器在Python中的实际工作原理。

Python @符号与装饰器基础

Python中@符号的用法解析

@符号在Python中主要用于定义装饰器,针对函数对象,实现调用与参数传递的功能。它区分了修饰器与被修饰对象的关系:‘@函数名'作为装饰器,作用于紧随其后的函数定义(该函数可以是另一个装饰器,也可以是普通函数定义)。

单装饰器执行流程分析

代码1


def funA(desA):
 print("It's funA")

def funB(desB):
 print("It's funB")

@funA
def funC():
 print("It's funC")

结果1

It's funA

分析1

@funA 修饰函数定义 def funC(),将 funC() 的引用赋值给 funA() 的形参 desA。执行过程由上而下:先定义 funA 和 funB,随后运行 funA(funC())。此时 desA 指向 funC(),接着 funA() 输出 ‘It's funA'。

嵌套装饰器调用机制

代码2


def funA(desA):
 print("It's funA")

def funB(desB):
 print("It's funB")

@funB
@funA
def funC():
 print("It's funC")

结果2

It's funA It's funB

分析2

@funB 修饰装饰器 @funA,而 @funA 修饰函数定义 def funC()。逻辑上,将 funC() 赋值给 funA() 的形参,再将 funA(funC()) 的结果赋值给 funB()。执行顺序由上而下:先定义 funA 和 funB,然后运行 funB(funA(funC()))。此时 desA=funC(),funA() 输出 ‘It's funA';desB=funA(funC()),随后 funB() 输出 ‘It's funB'。

参数传递与内存地址观察

代码3


def funA(desA):
 print("It's funA")

 print('---')
 print(desA)
 desA()
 print('---')

def funB(desB):
 print("It's funB")

@funB
@funA
def funC():
 print("It's funC")

结果3

It's funA < function funC at 0x000001A5FF763C80 > It's funC It's funB

分析3

同上,为了更直观地观察参数传递,打印 desA。其传递的是 funC() 的内存地址,即 desA 现在指向函数 desA()。执行 desA() 等同于执行 funC(),此时 desA=desA()=funC()。

装饰器链式调用的参数处理

代码4


def funA(desA):
 print("It's funA")

def funB(desB):
 print("It's funB")
 print('---')
 print(desB)

@funB
@funA
def funC():
 print("It's funC")

结果4

It's funA It's funB None

分析4

上述过程将 funC() 作为参数传给 funA,那么 funA(funC()) 如何传给 funB()?打印 desB 发现并没有显式的参数传递。是否可以理解为,当‘装饰器'修饰‘另一个装饰器'时,主要体现为函数的调用行为。

以上所述是小编给大家介绍的python中@的用法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表