python中的装饰器

本文深入探讨Python装饰器,包括基础概念、重叠装饰器、参数化装饰器以及标准库中的装饰器。通过实例解析,展示了装饰器如何简化代码并增强功能,同时介绍了闭包在装饰器中的作用。还讨论了装饰器的执行顺序及其在多层装饰器情况下的行为。此外,文章还提到了参数化装饰器如何处理带参数的函数,并演示了如何使用Python内置的装饰器如`property`和`classmethod`。
摘要由CSDN通过智能技术生成

一、装饰器基本概念

在学习装饰器前需要学习闭包的概念,可参考文章: python中闭包和nonlocal声明.
装饰器就是闭包的一种延申,比闭包更加简洁方便。

#使用闭包调用
def write(func):  #闭包
	def inner():
    	print("write a number")
    	func()
	return inner
	
def f1():
	print("I write a 1")
def f2():
	print("I write a 2")
	
f = write(f1)
f()
>>>
write a number
I write a 1

如果使用装饰器则会简单很多

def write(func):  #闭包
	def inner():
    	print("write a number")
    	func()
	return inner

@write  	#执行的是闭包调用里的:f = write(f1)
def f1():
	print("I write a 1")
def f2():
	print("I write a 2")

f1()  #可以直接使用f1()来达到闭包的效果
>>>
write a number
I write a 1

正如例子中的注解所说, @write 就是代替了闭包调用的一步,使代码更加简洁。

二、重叠装饰器

重叠装饰器就是在被装饰的函数前有两个装饰器,先运行的是离函数最近的那个装饰器,但是闭包中的内部函数运行的顺序正好相反。

def write_1(func):  #闭包
	print("runing write_1")
	def inner():
    	print("write a number,write_1")
    	func()
	return inner

def write_2(func):  #闭包
	print("runing write_2")
	def inner():
    	print("write a number,write_2")
    	func()
	return inner
@write_2
@write_1
def f1():
	print("I write a 1")
>>>
runing write_1
runing write_2
write a number,write_2  #注意顺序
write a number,write_1
I write a 1
I write a 2

三、参数化装饰器

参数化装饰器的意思是:在函数有参数时,闭包中的函数也应该有参数。并且必要时使用:(*参数名)->任意数量的参数。

def write_1(func):  #闭包
	print("runing write_1")
	def inner(*args):
    	print("write a number,write_1")
    	return func(*args)
	return inner
	
@write_1
def f1(a,b):
	return a+b
	
r = f1(10,11)
print(r)
>>>
runing write_1
write a number,write_1
21

四、标准库装饰器

python中内置了一部分装饰器,有property、classmethod等,可到python库查阅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值