闭包与装饰器(Python)

两层函数嵌套,内层函数用到了外层函数的参数,外部函数的变量和内部函数的整体称为闭包,可以作为参数进行传递,传递时不仅传递函数功能,也传递参数

闭包是装饰器的实现原理

def test1(num):
def test2():
    nonlocal num
    print(num)
    num = 100
    print(num)
return test2

t1 = test1(3)
t1()

函数/匿名函数/闭包/对象,当作实参时有什么区别?
1.匿名函数,能够完成基本简单功能,传递函数的引用,只有功能
2.普通函数,能完成复杂的功能,传迪函数的引用
3.闭包,较为复杂的功能,能够传递功能和数据
4.对象,能完成最为复杂的功能,传递很多数据和很多功能

装饰器

#coding=utf-8

def set_func(func):
	def call_func():
    	print("添加的装饰器的功能代码1")
   	 	print("添加的装饰器的功能代码2")
    	return func()  # 相当与把被装饰的函数拉了进来,使用return使装饰器通用
	return call_func

@set_func
def sunny():
	print("today is sunny!")

sunny()

装饰器用到了闭包,内层函数共享外层函数参数,和函数引用作为参数的特点

多个装饰器装饰的顺序

@set_func0
@set_func1
@set_func2
def sunny():
	print("today is sunny!gfsdf")

func2 --> func1 --> func0 --> func0 --> func1 --> func2 --> sunny

类装饰器

class Test(object):
	def __init__(self,func):
    	self.func = func
    	print("添加的装饰器的功能代码TTTTTTTTT")
	def __call__(self, *args, **kwargs):
    	print("添加的装饰器的功能代码TEEEESSSSSSTTTTT")
    	return self.func()  # 相当与把被装饰的函数拉了进来

@Test
def sunny():
	print("today is sunny!gfsdf")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值