Python3 装饰器三种常用语法详解:无参、带参及带参装饰器
本文详细总结 Python3 中三种最常用的装饰器语法。首先解析无参装饰器的基本原理,即通过 @ 符号将函数作为参数传递并返回新函数;其次介绍带参数的函数装饰器,重点说明如何处理内部函数的参数组合及返回值丢失问题;最后深入讲解带参数的装饰器,通过外层函数嵌套实现根据条件动态选择不同装饰逻辑。文章结合代码示例,清晰展示了日志记录、权限验证及 BUG 修复等实际应用场景,帮助开发者掌握装饰器的核心用法。
Python3 最常用的三种装饰器语法总结
1.简述语法
装饰器本质上是一种函数装饰器,其核心作用是在不修改原函数代码(即函数本体不变、执行逻辑不变)的前提下,为函数增加额外的“装饰”功能。它通过将原函数作为整体参数传递给装饰器,并返回一个新的函数对象,从而在函数执行时自动附加额外代码。这种机制常用于以下场景: 1.1 增加日志记录:许多原有函数未包含日志功能,通过统一添加日志装饰器,无需修改原代码即可实现记录。 1.2 实现验证功能:在函数执行前增加合规性检查,这是保障系统安全的重要措施。 1.3 补救函数缺陷:项目上线后发现重大 BUG,可通过添加装饰器进行修复,大幅降低代码修改的工作量。
2.不带参数的函数的装饰器
理解:@ 符号用于定义装饰器,最基础的装饰器是一个返回传入参数的函数。其本质是将整个函数视为参数传入并返回,此过程并未执行原函数,仅增加描述信息(如国家标识)。
def mycountry(m):
country = "china"
print(country)
return m
@mycountry
def myname():
name = "chengruofei"
print(name)
return name
myname()
执行结果:
python myname.py china chengruofei
备注: 可将 @ 符号理解为省略了第一步的赋值操作,即等价于: myname = mycountry(myname) myname()
3.带参数的函数的装饰器
**理解:** 需要在装饰器函数内部再定义一个函数,并确保该内部函数能组合传入的“两个参数”形成新函数,此时返回值变为构造出的内部函数。
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
@mycountry
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
执行结果:
china chengruofei ('I am a :', 'boy') TEST boy
备注: 通过此类装饰器包装后,原函数的返回值会丢失。
4.带参数的装饰器
**理解:** 常规装饰器本身无参数,参数由被装饰函数的定义决定。但当装饰器逻辑复杂、需集合大量功能时,需通过传入参数来执行特定的装饰器函数。实现方法是在原有解释器外层再包裹一层函数,并将中间层函数作为整体返回。
def myID(i):
if i == 'mycountry':
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return mycountry
else:
def myschool(m):
school = "shijiazhuangjisuanjizhiyejishuxueyuan"
print("I graduated from ",school)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return myschool
@myID('myschool')
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
执行结果:
('I graduated from ', 'shijiazhuangjisuanjizhiyejishuxueyuan') chengruofei ('I am a :', 'boy') TEST boy
到此这篇关于python3 最常用的三种装饰器语法总结的文章就介绍到这了,更多相关python3装饰器语法内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









