一切皆对象:
首先我们来理解下Python中的函数
def hi(a='qing'):
return 'la'+a
print(hi())===========结果为:"la qing"
我们也可以把这个函数赋值给一个变量
bb=hi
注意:复制的时候没有使用小括号,因为我们并没有调用hi函数
只是把它放在bb变量里,(其实也就是bb和hi同时引用这个函数)
print(bb())===========结果为:"la qing"
del hi
print(hi())============结果会报错
print(bb())===========结果为:"la qing"
在函数中定义函数:
def hehe():
print('现在在hehe函数中')
def ha():
print("做一个好学生")
def yi():
print("好好学习")
ha()
yi()
print("hehe函数结束")
hehe()
输出结果为:
'现在在hehe函数中'
"做一个好学生"
"好好学习"
"hehe函数结束"
注意:ha()和yi()函数不能在外面调用,只能在hehe()函数里面调用。
从函数中返回函数
注意:我们在函数中返回的是greet和welcome,而不是greet()和welcome(),因为当你把一对小括号放在后面,这个函数就会执行,然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。
将函数作为参数传给另一个函数
下面写一个装饰器:
上面这种写法是比较容易理解的方式,下面通过@来实现
这个两个方法实现的功能是一样的,第一种只是对于装饰器理解的一个过度,工作中还是用@这种,简单明了就可以知道是一个装饰器
但是,当我们打印被装饰的函数名字时发现,函数名字已经改变,针对这种情况我们要把装饰器的函数部分做一些调整
@wraps接受一个函数来进行装饰,并加入了复制函数名称,注释文档,参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。
那么带参数的装饰器怎么写?
带参数的装饰器指的是被装饰的函数需要传参
分析如下:
既然被装饰的函数需要传参,那么在它执行的时候肯定要传参的,所以装饰器里面a_func(a,b)肯定要把参数写在里面了(因为此时函数已经执行)
那么最里面这个a_func函数,又是在外面一层的函数wrapTheFunction执行后才能执行,所以参数在wrapTheFunction函数里就要传进来(总结来说就是一层套一层)
从最里面的函数找出处,然后把最顶端里面加上参数,那么为什么不在最外层a_new_decorator(a_func)这里面加参数呢,因为这里面接收的是被装饰的函数
下面是代码:
如果传的参数是不定长参数,就把a,b换成*args,**kwargs