Python 装饰器详解:函数与类装饰器的实现原理及代码范例
本文深入解析 Python 装饰器的核心机制,涵盖函数装饰器与类装饰器的实现原理。通过嵌套函数、*args/**kwargs 处理可变参数以及带参装饰器的代码范例,详细演示如何扩展函数功能。同时介绍利用 __call__ 方法实现类装饰器的技巧,帮助开发者掌握 Python 高级特性在实际开发中的应用。
什么是装饰器
从字面含义理解,装饰器是一种用于修饰其他对象的工具。在 Python 语言体系中,装饰器主要分为两类:函数装饰器和类装饰器。简而言之,函数装饰器专门用于修饰函数,其核心目的是在不修改原函数代码的前提下增加其功能;类装饰器则用于修饰类,旨在增强类的行为或属性。
函数装饰器
从实现本质来看,装饰器基于嵌套函数结构。以下展示一个最基础的装饰器示例。
# fun1为装饰器名称,function指的是被装饰的函数
def fun1(function):
def fun2():
print("开始了!")
function() # 执行被装饰的函数或者 或者 return function()
return fun2
外层的 fun1() 接收一个参数,该参数指向被装饰的目标函数;内层的 fun2() 负责执行 function 所指向的函数逻辑。这种结构体现了将函数作为参数传递给另一个函数的编程思想。
具体使用方法非常简洁:只需在目标函数定义上方添加 @符号及装饰器名称即可。
@fun1
def fun3():
print("aaa")
fun3()
这种语法糖写法在逻辑上等价于手动调用装饰器函数。
def fun3():
print("aaa")
fun = fun1(fun3)
fun()
两种写法产生的执行结果完全一致。
实际运行输出如下:
开始了! aaa
若被装饰的函数需要接收参数,装饰器内部需相应调整以传递这些参数。
def fun1(function):
def fun2(a):
print("开始了!")
function(a)
return fun2
@fun1
def fun3(a):
print(a)
fun3("aaa")
此时的输出结果为:
开始了! aaa
当无法预知被装饰函数具体需要多少个参数时,可以使用可变参数列表进行适配。
def fun1(function):
def fun2(*args, **kwargs):
print("开始了!")
function(*args, **kwargs)
return fun2
@fun1
def fun3(a,b):
print(a,b)
@fun1
def fun4(a,b,c):
print(a,b,c)
fun3("aaa","bbb")
fun4("ccc","ddd","eee")
运行结果展示如下:
开始了! aaa bbb 开始了! ccc ddd eee
如果装饰器本身也需要接收参数(即带参装饰器),则需要在外层再嵌套一层函数。
def fun(msg):
def fun1(function):
def fun2(*args, **kwargs):
print("开始了!{}".format(msg))
function(*args, **kwargs)
return fun2
return fun1
@fun(msg="小朋友")
def fun3(a,b):
print(a,b)
fun3("aaa","bbb")
运行结果如下:
开始了!小朋友 aaa bbb
类装饰器
类装饰器的使用逻辑与函数装饰器基本一致,区别在于装饰器本身由一个类来实现。
class fun1(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print(("开始了!")
self.func(*args, **kwargs)
@fun1
def fun2(a,b):
print(a,b)
fun2("aaa","bbb")
类装饰器的实现依赖于类的 __call__ 魔术方法。
运行结果如下:
开始了! aaa bbb
此外,类装饰器也可以设计为接收参数的形式。
class fun(object):
def __init__(self, msg):
self.msg = msg
def __call__(self, func):
def fun1(*args, **kwargs):
print("开始了!{0}".format(self.msg))
func(*args, **kwargs)
return fun1
@fun(msg="小朋友")
def fun2(a, b):
print(a, b)
fun2("aaa,","bbb")
运行结果如下:
开始了!小朋友 aaa, bbb
至此,关于 Python 装饰器的详解与应用范例介绍完毕。如需了解更多相关 Python 装饰器内容,建议搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









