py 5.15

一、函数的有用信息

#函数的有用信息
#打印出函数名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__)
View Code

二、带参数的装饰器

#带参数的装饰器
#局部变量只能引用全局变量,不能修改!#局部变量只能引用父级或上一层的局部变量,不能修改!
#一、引用
# 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
# ...
View Code

三、多个装饰器装饰一个函数

#多个装饰器装饰一个函数:(结果为一个套一个,最中间夹着被装饰的函数的值)
# 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()
View Code

 

posted @ 2018-05-15 17:02  消暑酸梅粉  阅读(64)  评论(0编辑  收藏  举报