对闭包,装饰器的简单理解

闭包三要素
1,有一个外部函数outer,outer内部再定义一个内部函数inner
2,outer函数的参数,被内部函数inner调用
3,外部函数将内部函数作为返回值返回

由此我们可以定义一个闭包

第一步:
#定义外部函数outer,设置参数为func

def outer(func):
#定义内部函数inner
****def inner():
****print(",,,,,,")
#在inner函数内部调用外部函数的参数func,并将其作为一个函数
*** func()
****print("。。。。。。")
#将inner作为外部函数的返回值返回
return inner

第二步:
#内部函数将外部函数的参数func作为一个函数调用,那么我们在外部将func函数定义出来,
def func():
***print(“止戈”)
#调用函数
func()--------------->打印结果为“止戈”

第三步:
#实例化outer函数并调用,
f = outer(func)
f()

分析:
1,参数func此时是一个函数,返回值为“止戈”,
2,此时func被内部函数inner调用,返回结果同样为“止戈”,
3,只是在“止戈”的外部添加了两个附加内容“,,,,,”和“。。。。。。”
所以此时inner函数的返回值变成了:

,,,,,,,
止戈
。。。。。。。

4,此时,inner函数又被outer函数作为返回值返回,因此outer的返回中出现了上面的结果

5,实际操作中,我们使用更加优雅的方式,操作装饰器
def outer(func):
***def inner():
***print(",,,,,,")
***func()
***print("。。。。。。")
return inner

@outer
def welcome():
***print(“止戈”)
welcome()

装饰器的应用
装饰器的核心思想是降低代码的耦合度,比如一根木杆,我们给他加上一个枪头,他就变成了武器(长枪依在),给他加一个铁耙,他就变成了农具(上马为兵,下马为农),如果我们同时给他装上枪头和铁耙,那么务农时就要拆枪头,打仗时就要拆铁耙,很麻烦,还可能会损坏木杆

代码模块也是同样的道理,原始的功能模块,越纯净越好,当我们需要某功能,而该功能模块又不具备的时候,就可以通过装饰器,给他加装该功能,而下次需要另外一个功能时,再定义一个装饰器即可,耦合度低,代码灵活度就高了

猜你喜欢

转载自blog.csdn.net/zhige1112/article/details/85275062
今日推荐