Python 装饰器详解:函数与类装饰器的实现原理及代码范例

苏见山
苏见山
发布时间:2026-10-14 | 2人浏览过
原创

本文深入解析 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 装饰器内容,建议搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表