本文介绍: 装饰器的概念器、装饰器的简易版本装饰器进阶版本(重要)、装饰器练习题(认证登录功能)、装饰器的固定模板语法

装饰器的概念

# 装饰器是由之前我们学习的名称空间、函数嵌套、闭包函数知识点汇总而来

1、定义:装饰—添加功能   器–指工具

2、核心思想:在’不改变原来的调用方式’和’内部代码‘的基础之上给函数添加额外的功能’.

def index():
    pass      # 不改变
index()

3、给index函数添加统计执行时间的功能:

      # 时间戳:time.time() ,从1970-1-1到当前时间的秒数

      # 内置的时间模块import time

      # 睡眠:time.sleep()

def index():
    time.sleep(3)
    print('from index')  # 1. 在执行函数之前加一个时间start_time = time.time() # 此时的时间index()
end_time = time.time()   # 2. 等index函数执行之后在打个时间print('index一共执行了%s秒' % (end_time - start_time))    # 3. 获取index 的总执行时间

装饰器的简易版本

import time
def index():
    time.sleep(3)
    print('from index')
def home():
    time.sleep(1)
    print('from home')
def outer(func):
    def get_time():
        start_time = time.time()
        func()  # 只能够统计index函数的时间
        end_time = time.time()
        print('执行时间:%s' % (end_time - start_time))
    return get_time
index = outer(index)  # res:get_time的函数名(其实也是get_time的内存地址)
index()  # get_time()
# res = outer(home)
# res()

装饰器进阶版本(重要)

def outer(func):
    # func:index
    # func = home
    def get_time(*args, **kwargs):
        # func:index
        start_time = time.time()
        # index() # 只能够统计index函数的时间
        # func()---->index()
        # func:home
        res=func(*args, **kwargs)  # 只能够统计index函数的时间
        end_time = time.time()
        print('执行时间:%s' % (end_time - start_time))
        # return res # 其实返回的是上面index的返回return res
    return get_time
home = outer(home)
res=home('jerry')  # get_time('jerry')
print(res)

装饰器练习题(认证登录功能)

# 必须登录之后才能够访问函数
def index():
    print('from index')
def home():
    print('from home')
def home1():
    print('from home1')
# index()
# 用户必须是登录之后才能访问,否则不让访问
is_login={'is_login':False}
# 1. 写一个登录程序
def outer(func):
    # func = index
    def auth():
        if is_login.get('is_login'):
            ## 如果条件成立,直接执行函数
            res=func()
            return res # 解决返回问题username = input('username:>>>').strip()
        password = input('password:>>>').strip()
        # 2. 比较用户名和密码
        if username == 'jerry' and password == '123':
            # 执行函数
            print('登录成功')
            func()
            is_login['is_login'] = True #
        else:
            print('用户名或者密码错误')
    return auth
index=outer(index)
index()
home=outer(home)
home()
home1=outer(home1)
home1()
"""只要登录成功一次,后续的函数就不用在登录了"""

装饰器的固定模板

def outer(func):
    def inner(*args, **kwargs):
        print('函数被调用之前需要添加的功能')
        res = func(*args, **kwargs)  # 真正的函数执行
        print('函数被调用之后需要添加的功能')
        return res
    return inner
index = outer(index)      # index()
res = index               # 语法糖
print(res)

语法

1、语法糖的原理:它会把下面的被装饰对象的名字当成参数传递给装饰器

2、语法糖的书写规范:@装饰器名字

                                      必须把上面的写在被装饰对象的头上(紧贴着被装饰对象写)

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

def outer(func):
    def inner(*args, **kwargs):
        print('函数被调用之前需要添加的功能')
        res = func(*args, **kwargs)  # 真正的函数执行
        print('函数被调用之后需要添加的功能')
        return res
    return inner
index()

今日思维导图:

原文地址:https://blog.csdn.net/qq_48064830/article/details/132760061

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_3222.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注