python中的装饰器

python中的装饰器

  • 一、装饰器基本概念
  • 二、重叠装饰器
  • 三、参数化装饰器
  • 四、标准库装饰器

一、装饰器基本概念

在学习装饰器前需要学习闭包的概念,可参考文章: 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库查阅。

你可能感兴趣的:(python学习笔记,python,装饰器,函数闭包)