一、函数的有用信息
#函数的有用信息 #打印出函数名print(login.__name__) #打印出login函数中的注释print(login__doc__) #装饰器外,login已经被重新赋值成为inner,所以,要正常在函数体外打印函数名和注释,需要在内层函数inner上面加一个带 #参数(参数就是login)的装饰器。 # from functools import wraps # def func(f): # @wraps(f) #参数为代表login的形参f # def inner(): # f() # return inner # @func # def login(): # '''此函数是用来测试的''' # login() # # print(login.__name__) # print(login.__doc__)
二、带参数的装饰器
#带参数的装饰器 #局部变量只能引用全局变量,不能修改!#局部变量只能引用父级或上一层的局部变量,不能修改! #一、引用 # count = 1 # def func(): # count = 2 #在局部作用域中,count变成了2,但是全局中依然没有改变 # func() #二、引用 # count = 1 # def func(): # print(count) #引用全局变量,但是依然没有将其改变 # func() #三、内存产生歧义 # count = 1 # def func(): # count = count + 1 #=右边的count可以取到全局中的值1,但是左边,内存无法识别到底是1还是新定义的变量。出错。 # func() #四、局部对局部,同理 # def func1(): # count = 1 # def func2(): # count = count + 1 #左边的count无法识别,出错 # func2() # func1() #五、解决办法1 : 若想修改,用global或者nonlocal # flag = True # def func1(): # name = input('请输入') # global flag #然后在最前面加上global flag,让第一个flag明确自己的身份,就不出错了 # if flag : #flag本来是可以引用的,但是由于后面做了修改动作,所以内存产生歧义。出错 # print('flag是真') # if name == 'lg': # print('将flag变成假的') # flag = False #将flag的值改变 # func1() #***解决办法2:传参 (内层函数引用全局变量的一种方法) #例:将多个函数同时加上装饰器,或者同时取掉装饰器。依靠全局变量flag。 # def time_out(flag1): #将flag的值传给形参flag1 #带参数的装饰器,为了将全局的变量传入装饰器函数中。 # def wrapper(f): # def inner(*args,**kwargs): # if flag: #在内层函数中,可以引用flag的值。但是不能对其修改。 # '''执行函数之前的操作''' # f(*args, **kwargs) # '''执行函数之后的操作''' # else: # f(*args, **kwargs) #如果flag是假。则不加任何修饰,直接执行下面的各个函数。 # return inner # return wrapper # # flag = True #只要靠更改flag,就可以随意控制是否要给以下函数加装饰器了。 # @time_out(flag) #看到有参数的装饰器,先执行带有此函数名的函数。结果为@wrapper: 以前普通的装饰器。 # def func1(): # pass # @time_out(flag) # def func2(): # pass # ...
三、多个装饰器装饰一个函数
#多个装饰器装饰一个函数:(结果为一个套一个,最中间夹着被装饰的函数的值) # def wrapper1(f): # def inner1(): # print('执行inner1之前') #二 # f() #此f依然是第一次传进来的func,所以执行被装饰的函数。 # print('执行inner1之后') #四 # return inner1 # # def wrapper2(f): # def inner2(): # print('执行inner2之前') #一 # f() #f = func = inner1 , f() = inner1(),执行inner1 # print('执行inner2之后') #五 #inner1执行完之后又回到这里。 # return inner2 # # 多个装饰器,由内而外执行。 # @wrapper2 #func=wrapper2(func),func = inner1,f = func = inner1, # @wrapper1 #func=wrapper1(func) 返回inner1,func = inner1 # def func(): # print('in f') #三 # func()