如何深入理解Python装饰器的本质和应用?

2026-05-16 19:112阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1437个文字,预计阅读时间需要6分钟。

如何深入理解Python装饰器的本质和应用?

合理使用装饰器可以简化开发,并使代码更清晰。以下介绍两种装饰器,不带参数的装饰器和带参数的装饰器。

一、不带参数的装饰器不带参数的装饰器是最基本的装饰器形式,可以直接应用于函数或类。以下是一个使用不带参数装饰器的示例:

pythondef my_decorator(func): def wrapper(): print(装饰器执行前的代码) func() print(装饰器执行后的代码) return wrapper

@my_decoratordef say_hello(): print(Hello, World!)

say_hello()输出:装饰器执行前的代码Hello, World!装饰器执行后的代码

二、带参数的装饰器带参数的装饰器允许你将参数传递给装饰器,这些参数可以用来定制装饰器的行为。以下是一个使用带参数装饰器的示例:

pythondef my_decorator_with_args(name): def decorator(func): def wrapper(): print(fHello, {name}!) func() print(fBye, {name}!) return wrapper return decorator

@my_decorator_with_args(Alice)def say_goodbye(): print(Goodbye, World!)

say_goodbye()输出:Hello, Alice!Goodbye, World!Bye, Alice!

合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。

一、不带参数的装饰器

我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is running",这时候我们可以在方法A()的开始部分加上下面的代码:

print("functionisrunning")

但是如果我们不想修改方法A()的代码,也可以重新写一个方法decorator(),然后把A()作为入参,代码如下:

defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Methodisrunning") returnfun() returnwrapper

python中的方法可以作为参数传入另一个方法,所以当我们执行decorator(A)的时候,返回的是一个方法,这个方法的本质是先执行print语句,然后再执行A()。

但是这样我们的调用代码就需要进行修改,也就是说之前调用方法A(),现在的写法是调用decorator(A)(),为了不影响调用的代码,我们使用python的语法糖改造方法A()的代码。

@decorator defA(): #dosomething

实际上只是在A()的前面加上一行@decorator,这样在我们的调用代码就不需要改变了。

装饰器中的@functools.wraps(fun)是为了保证返回的方法__name__属性和入参方法fun的__name__属性相同。

二、带入参的装饰器

在上面不带参数的装饰器中,我们实现了在执行方法A()之前打印一行固定的字符串,如果我们想要打印不同的字符串就需要用带参数的装饰器。实际上就是在不带参数的装饰器上再封装一层即可,代码如下:

defdecorator_par(name): defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Method{}isrunning".format(name)) returnfun() returnwrapper returndecorator

这样我们就可以在使用装饰器的时候设置参数name,实现打印不同的信息。完整的代码如下:

importfunctools defdecorator_par(name): defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Method{}isrunning".format(name)) returnfun() returnwrapper returndecorator @decorator_par("A") defA(): print("IamA") @decorator_par("B") defB(): print("IamB") A() B()

执行输出为:

MethodAisrunning IamA MethodBisrunning IamB

可以看到我们在不改变方法调用代码的情况下,实现了在该方法之前打印特定的信息。

以上就是装饰器的两种实现示例,实际开发中也可以将多个装饰器进行嵌套,可以实现更加复杂的需求。

内容扩展:

python函数式编程之装饰器

1.开放封闭原则

简单来说,就是对扩展开放,对修改封闭。

在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。

此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。

2.什么是装饰器

装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。

所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。

3.装饰器的作用

在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。

如何深入理解Python装饰器的本质和应用?

以上就是如何真正的了解python装饰器的详细内容,更多关于你真的了解python装饰器么的资料请关注易盾网络其它相关文章!

本文共计1437个文字,预计阅读时间需要6分钟。

如何深入理解Python装饰器的本质和应用?

合理使用装饰器可以简化开发,并使代码更清晰。以下介绍两种装饰器,不带参数的装饰器和带参数的装饰器。

一、不带参数的装饰器不带参数的装饰器是最基本的装饰器形式,可以直接应用于函数或类。以下是一个使用不带参数装饰器的示例:

pythondef my_decorator(func): def wrapper(): print(装饰器执行前的代码) func() print(装饰器执行后的代码) return wrapper

@my_decoratordef say_hello(): print(Hello, World!)

say_hello()输出:装饰器执行前的代码Hello, World!装饰器执行后的代码

二、带参数的装饰器带参数的装饰器允许你将参数传递给装饰器,这些参数可以用来定制装饰器的行为。以下是一个使用带参数装饰器的示例:

pythondef my_decorator_with_args(name): def decorator(func): def wrapper(): print(fHello, {name}!) func() print(fBye, {name}!) return wrapper return decorator

@my_decorator_with_args(Alice)def say_goodbye(): print(Goodbye, World!)

say_goodbye()输出:Hello, Alice!Goodbye, World!Bye, Alice!

合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。

一、不带参数的装饰器

我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is running",这时候我们可以在方法A()的开始部分加上下面的代码:

print("functionisrunning")

但是如果我们不想修改方法A()的代码,也可以重新写一个方法decorator(),然后把A()作为入参,代码如下:

defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Methodisrunning") returnfun() returnwrapper

python中的方法可以作为参数传入另一个方法,所以当我们执行decorator(A)的时候,返回的是一个方法,这个方法的本质是先执行print语句,然后再执行A()。

但是这样我们的调用代码就需要进行修改,也就是说之前调用方法A(),现在的写法是调用decorator(A)(),为了不影响调用的代码,我们使用python的语法糖改造方法A()的代码。

@decorator defA(): #dosomething

实际上只是在A()的前面加上一行@decorator,这样在我们的调用代码就不需要改变了。

装饰器中的@functools.wraps(fun)是为了保证返回的方法__name__属性和入参方法fun的__name__属性相同。

二、带入参的装饰器

在上面不带参数的装饰器中,我们实现了在执行方法A()之前打印一行固定的字符串,如果我们想要打印不同的字符串就需要用带参数的装饰器。实际上就是在不带参数的装饰器上再封装一层即可,代码如下:

defdecorator_par(name): defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Method{}isrunning".format(name)) returnfun() returnwrapper returndecorator

这样我们就可以在使用装饰器的时候设置参数name,实现打印不同的信息。完整的代码如下:

importfunctools defdecorator_par(name): defdecorator(fun): @functools.wraps(fun) defwrapper(*args,**kwargs): print("Method{}isrunning".format(name)) returnfun() returnwrapper returndecorator @decorator_par("A") defA(): print("IamA") @decorator_par("B") defB(): print("IamB") A() B()

执行输出为:

MethodAisrunning IamA MethodBisrunning IamB

可以看到我们在不改变方法调用代码的情况下,实现了在该方法之前打印特定的信息。

以上就是装饰器的两种实现示例,实际开发中也可以将多个装饰器进行嵌套,可以实现更加复杂的需求。

内容扩展:

python函数式编程之装饰器

1.开放封闭原则

简单来说,就是对扩展开放,对修改封闭。

在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。

此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。

2.什么是装饰器

装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。

所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。

3.装饰器的作用

在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。

如何深入理解Python装饰器的本质和应用?

以上就是如何真正的了解python装饰器的详细内容,更多关于你真的了解python装饰器么的资料请关注易盾网络其它相关文章!