最近在慕课上学python的闭包和装饰器,一开始是真的是一脸懵逼啊,评论区大部分也是这样的声音。
话说回来,python的闭包和装饰器也是python的一特色了。闭包的概念是内部函数对enclosing作用域的变量进行引用。enclosing的定义百度上有,我这个菜鸟就不说了。
def my_sum(*arg):
return sum(arg)
def dec(func):
def in_dec(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isnatance(val,int):
return 0
return func(*arg)
return in_dec
my_sum = dec(my_sum)
my_sum(1,2,3,4,5)
定义的dec函数接受一个参数,这个参数是一个函数,调用函数体后,最后返回的是in_dec函数,所以说,my_sum = dec(my_sum)执行后,my_sum = in__dec。
此时的my_sum(1,2,3,4,5),就等于是in_dec(1,2,3,4,5)。不过在执行in_dec自身的函数体之后,它还会执行my_sum定义时的函数体,相当于把my_sum的函数体放到in_dec里面了。
def dec(func):
dec in_dec(*args):
if len(arg) == 0:
return 0
for val in arg:
if not isnatance(val,int):
return 0
return func(*args)
return in_dec
@dec
def mu_sum(*args):
return sum(arg)
my_sum(1,2,3,4,5)
装饰器是对闭包的一个应用,两者原理差不读,不过就是定义时要加 “@” 这个符号。
因为my_sum函数定义时用dec装饰了,所以,和闭包一样,先调用dec内部的函数体,返回in_dec;此时传入my_sum的参数就传入了in_dec,在完成函数体的执行后,就调用my_sum自己的函数体。