装饰器函数的有用信息

装饰器的有用信息
三个引号一回车
def login():
    """

    :return:
    """
写入备注:
def login(username,password):
    """
    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: Ture登录成功。 False登录失败。
    """
    print('登录成功...')
    return True
login(1,2)

打印信息:
def login(username,password):
    """
    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: Ture登录成功。 False登录失败。
    """
    print('登录成功...')
    return True
login(1,2)
print(login.__name__)     #打印函数名
print(login.__doc__)      #打印函数注释
打印函数的有用信息:
from functools import wraps
def wrapper(f):
    @wraps(f)
    def inner(*args,**kwargs):
        '''执行函数之前的操作'''
        ret = f(*args,**kwargs)
        '''执行函数之后的操作'''
        return ret
    return inner
@wrapper
def login(username,password):
    '''
    此函数需要用户名,密码两个参数,完成的是登录的功能。
    :return: Ture登录成功。 False登录失败。
    '''
    print('登录成功..')
    return True
print(login.__name__)
print(login.__doc__)

from functools import wraps
View Code
import time
flag = True
def timer(f):
    def inner(*args,**kwargs):
        if flag:
            star_time = time.time()
            time.sleep(0.3)
            ret = f(*args,**kwargs)
            end_time = time.time()
            print('执行效率%s'%(end_time-star_time))
            return ret
    return inner()
@timer
def func1():
    print(111)
@timer
def func2():
    print(222)
@timer
def func3():
    print(333)
View Code
面试题:(,报错原因)
1,
count = 1
def func1()
    print(count)
func1
#局部作用域可以对全局作用域的变量进行引用。
count = 1
2,****
count = 1
函数内部如果有变量名与全局变量名相同且对此变量进行改变,
python就会将你引用的那个变量视为局部定义的变量,但是局部没定义,
则他会报错。
def func1():
    count = count + 1
    print(count)
func1()
3,
flag = True
def func1():
    if flag:
        print(333)
    global flag
    flag = False
func1()
4,
flag = True
while flag:
    print(333)
    flag = False
    print(222)
for if while 没有开辟临时空间。
5,
count = 1
def func4():
    count = count + 1
    print(count)
func4()   #局部只能引用全局的变量,不能修改,如果要修改global.
结果会报错,因为赋值浅引用的全局变量count分不清是修改的还是引用的
6,函数中如果使用global + 变量 必须是第一次使用这个变量。
flag = True
def func1():
    if flag:
        print(333)
    global flag
    flag = False
func1()
View Code
带参数的装饰器:
import time
def timer_out(flag1):
    def timer(f):
        def inner(*args,**kwargs):
            if flag1:
                start_time = time.time()
                time.sleep(0.3)
                ret = f(*args,**kwargs)
                end_time = time.time()
                print('执行效率%s'%(end_time-start_time))
                return ret
            else:
                ret = f(*args,**kwargs)
                return ret
        return inner
    return timer
flag = True
@timer_out(flag)
def func1():
    print(111)
@timer_out(flag)
def func2():
    print(222)
@timer_out(flag)
def func3():
    print(333)
func1()
func2()
func3()
View Code
带参数装饰器默写:
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()
View Code
多个装饰器装饰一个函数:
def wrapper1(func): # func = f函数名
    def inner1():
        print('wrapper1 ,before func')  # 2
        func()
        print('wrapper1 ,after func')  # 4
    return inner1

def wrapper2(func):  # func = inner1
    def inner2():
        print('wrapper2 ,before func')  # 1
        func()  # inner1()
        print('wrapper2 ,after fmunc')  # 5
    return inner2
@wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
@wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1
def f():
    print('in f')  # 3

f()  # inner2()
View Code
多个装饰器装饰一个函数默写
def wrapper1(fn):
    def inner(*args,**kwargs):
        print('11执行目标函数之前的操作')
        ret = fn(*args,**kwargs)
        print('11执行目标函数之后的操作')
        return ret
    return inner
def wrapper2(fn):
    def inner(*args,**kwargs):
        print('22执行目标函数之前的操作')
        ret = fn(*args,**kwargs)
        print('22执行目标函数之后的操作')
        return ret
    return inner
@wrapper2  #用[ ]表示
@wrapper1  #用( )表示
def func():
    print('333')   #目标
func()
[ ( 目标 )] : 从左到右依次执行
#####哪个装饰器在最上边,执行的时候就在最外边(谁在最上边,谁在最外边)
22执行操作之前
11执行操作之前
333
11执行操作之后
22执行操作之后
View Code

 

 

posted on 2018-05-29 21:45  liangliang123456  阅读(115)  评论(0编辑  收藏  举报

导航