python装饰器的学习笔记和*args、**kwargs的用法
装饰器
装饰器是基于闭包上的:闭包是发生函数嵌套,外层函数的返回值为内层函数的函数名,外层函数要有参数,往往被内层函数使用。@函数名就是一个装饰器 简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。(来自其他帖子)
定义一个简单的装饰器
首先定义一个装饰器函数test2,传参为func,装饰器的传参即为装饰器的函数名,可在装饰器中直接调用 在装饰器中创建一个内置函数,内置函数引用外置函数的变量需要使用nonlocal 装饰函数返回值为内置函数,不需要加() 装饰器装饰普通函数时格式:在普通函数的上方使用@装饰器函数名 在装饰器中为装饰的函数传参时不需要在装饰器函数添加传参,只需要在装饰器的内置函数中添加传参即可
def test2(func):
count = 1
def test2_1(*args, **kwargs): # 为内置函数传参,不需要在装饰器函数上添加*args, **kwargs
nonlocal count # 这里是内置函数应用外部函数的局部变量
func(*args, **kwargs) # 为被装饰的函数传参
print(函数调用{}.format(func.__name__)) # 打印func函数的名字,即被装饰函数的名字
count += 1
return test2_1 # 返回内置函数,不需要加()
@test2 # 装饰器test2装饰函数test1
def test1():
print(test1)
@test2
def test3(x): # 设置传参函数
for i in range(x):
print(这是test3的------{}.format(i))
test1() # 调用被装饰的函数
test3(3) # 调用被装饰的函数,并为被装饰的函数传参
print(test1.__name__)
print(test3.__name__) # 打印被装饰函数test3的函数名
装饰器执行返回值
通过返回值可以看到 当函数被装饰器调用在装饰器内部调用时,函数名仍然时函数名本身,但是在外部查看函数名name时为装饰器的name
test1 函数调用test1 这是test3的------0 这是test3的------1 这是test3的------2 函数调用test3 test2_1 test2_1
python中*args和**kwargs的使用
*args和**kwargs均为可变参数; *args是将多个和一个参数放到一个元组中 **kwargs是将一个或多个key=vlaue的格式将所有的参数放入到一个字典中 通过下面的代码直观的展示两者之间用的用法
def test4(*args):
print(args)
print(type(args))
def test5(**kwargs):
print(kwargs)
print(type(kwargs))
keys = kwargs.keys()
values = kwargs.values()
print(keys is: {}.format(list(keys)))
print(values is : {}.format(list(values)))
test4(1, 2, 3, 4)
test5(c=1,t=1, e=2, r=3)
*args和**kwargs示例返回值
通过下面的结果可以很明显的看到我们的*args和**kwargs的区别和用法
(1, 2, 3, 4)
<class tuple>
{
c: 1, t: 1, e: 2, r: 3}
<class dict>
keys is: [c, t, e, r]
values is : [1, 1, 2, 3]
