3月01日课后总结

3/01课后总结

装饰器装饰器简易版本

def outer(func_name):
    # func_name = index
    def get_time():
        # 1. 在函数执行之前,要记录一下此时的时间
        start_time = time.time()
        # 2. 开始执行函数
        func_name()
        # 3. 函数执行完毕之后,再次记录此时的时间
        end_time = time.time()
        # 4. 统计函数的执行时间
        print('执行了%s秒' % (end_time - start_time))
    return get_time
index=outer(index) # get_time的内存地址
index()

装饰器解决参数问题

def outer(func_name):
    # func_name = index
    def get_time(*args, **kwargs):
        # 1. 在函数执行之前,要记录一下此时的时间
        start_time = time.time()
        # 2. 开始执行函数
        func_name(*args, **kwargs)
        # 3. 函数执行完毕之后,再次记录此时的时间
        end_time = time.time()
        # 4. 统计函数的执行时间
        print('执行了%s秒' % (end_time - start_time))
    return get_time
index = outer(index)  # get_time的内存地址
index()

解决返回值问题


def outer(func_name):
    # func_name = index
    def get_time(*args, **kwargs):
        # 1. 在函数执行之前,要记录一下此时的时间
        start_time = time.time()
        # 2. 开始执行函数
        res=func_name(*args, **kwargs)  # index()
        # 3. 函数执行完毕之后,再次记录此时的时间
        end_time = time.time()
        # 4. 统计函数的执行时间
        print('执行了%s秒' % (end_time - start_time))
        return res  # 才是真正的函数的返回结果
    return get_time
# index = outer(index)  # get_time的内存地址
# res=index()
# print(res)  # None

home=outer(home)
print(home())

课堂练习题1

# 写一个认证装饰器
# 定义一个index函数,让用户输入用户名和密码,如果输入正确,就执行index函数,否则不能执行函数

def outer(flag):
    # flag
    def config():
        x = input('请输入用户名')
        y = input('请输入密码')
        if x == '111' and y == '111':了,
            flag()
    return config


@outer
def index():
    print(123)


# index = outer(index)
index()

装饰器的固定模板

def outer(func):
    def inner(*args, **kwargs):
        #  此处为函数执行前需要添加的功能
        res=func(*args, **kwargs)
        #  此处为函数执行后需要添加的功能
        return res
    return inner

语法糖

@outer  # index=outer(index)
def index():
    print('from index')
index()

@outer  # home = outer(index)
def home():
    print('from home')
"""
    在需要装饰的函数前加@+装饰函数名
"""

多层语法糖

@login_auth # index=login_auth(get_time)
@outer  # get_time=outer(index)
def index():
    print('from index')
index()
"""
	在需要装饰的函数前加多个@+装饰函数名
	自上向下,最低层在最上层
	运行时,自下向上,从最下一个开始调用
"""

装饰器修复技术

from functools import wraps
def login_auth(func_name):
    # func_name = index
    @wraps(func_name)  # 修复技术是为了让被装饰对象不容易被察觉装饰了
    def auth():
        # 1. 让用户输入用户名和密码
        username = input('username:').strip()
        password = input('password:').strip()

        # 2. 要认证,判断用户名和密码是否正确
        if username == 'kevin' and password == '123':
            # 才是正常执行的函数
            res=func_name()
            return res
        else:
            print('认证失败,不能执行函数')
    return auth

@login_auth
def index():
    print(123)


help(index)
"""
    Help on function index in module __main__:
    此时就是已经被装饰过index()显示为index
    Help on function auth in module __main__:
	这是没有被装饰过的
"""

课堂练习题2

# 判断七句print执行顺序
def outter1(func1):
    print('加载了outter1')
    def wrapper1(*args, **kwargs):
        print('执行了wrapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1

def outter2(func2):
    print('加载了outter2')
    def wrapper2(*args, **kwargs):
        print('执行了wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print('加载了outter3')
    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')
        res3 = func3(*args, **kwargs)
        return res3
    return wrapper3


@outter1
@outter2
@outter3
def index():
    print('from index')
'''
	自下向上去调用,然后可以采用函数递归的思想来思考结果
'''

有参装饰器

def outter(source_data,a,b,c,d,e,f, *args, **kwargs):
    source_data='file'
    def login_auth(func_name):
        # func_name = index
        def auth(*args, **kwargs):
            # 1. 让用户输入用户名和密码
            username = input('username:').strip()
            password = input('password:').strip()
    
            # 2. 要认证,判断用户名和密码是否正确
            if source_data == 'file':
                print('数据来源是文件')
            elif source_data=='mysql':
                print('数据来源是MySQL')
            elif source_data=='oracle':
                print('数据来源是oracle')
            else:
                print('认证失败,不能执行函数')
                
        return auth
    return login_auth


@outter('file',1,2,3,4,5,6,) # @login_auth
def index():
    print('from index')
posted @ 2023-03-01 20:58  橘子熊何妨  阅读(19)  评论(0)    收藏  举报