• Python -- 装饰器


    5.15 装饰器

    1. 开放封闭原则
      • 封闭原则: 不改变源码.
      • 开放原则: 更新增加一些额外的功能.

    Python中装饰器:完美的诠释开放封闭原则

    装饰器就是一个函数:装饰一个函数,在不改变原函数的源码以及调用方式的前提下,给其增加一个额外的功能

    # 装饰器模板
    
    def warpper(f):
        def inner(*args,**kwargs): # * 在定义函数: 聚合
            '''被装饰函数执行前的操作'''
            ret = f(*args,**kwargs)  # * 在执行函数: 打散
            '''被装饰函数执行后的操作'''
            return ret
        return inner
    -------------------------------------------------------
    @warpper   #  func = warpper(func)
    def func(*args,**kwargs):
        pass
    func(a,b)
    
    # 博客园的登录认证  *****
    
    # 设置状态
    dic_status = {'name':None,'status':False}
    # 读取文件内容,字典推导式
    def get_dic_user_pwd():
        with open('register',mode='r',encoding='utf-8') as f:
            return {i.strip().split('|')[0]:i.strip().split('|')[1] for i in f}
    
    # 三次重复登录
    def login(dic_user_pwd):
        dic = dic_user_pwd()
        count = 1
        while count <= 3:
            username = input('请输入用户名').strip()
            password = input('请输入密码').strip()
            if username in dic and password == dic[username]:
                dic_status['username'] = username
                dic_status['status'] = True
                return True
            count += 1
        return False
    # 登录认证
    def auth(func):
        def inner(*args,**kwargs):
            '''要进行登陆认证:
                有两个分支:
                    1,如果之前登陆成功了,直接访问。
                    2,如果这是之前没有登陆过,先进行三次登陆。
            '''
            if dic_status['status']:
                ret = func(*args,**kwargs)
                return ret
            else:
                if login(get_dic_user_pwd):
                    ret = func(*args, **kwargs)
                    return ret
        return inner
    
    @auth
    def article():
        print('欢迎访问文章页面')
    article()
    @auth
    def diary():
        print('欢迎访问日记页面')
    diary()
    @auth
    def comment():
        print('欢迎访问评论页面')
    comment()
    

    带参数的装饰器 -- 开发思路:增强耦合性

    @wrapper_out(n)

    1. 执行 wrapper_out(参数) 这个函数,把相应的参数传给n,并且得到返回值--wrapper.
    2. 将@ 与wrapper 结合,得到标准版的装饰器,按照装饰器的执行流程执行
    def wrapper_out(n):
        def wrapper(f):
            def inner(*args,**kwargs)
            	uesrname = input('输入用户名')
                password = input('输入密码')
                with open(n,mode='r',encoding='utf-8') as f1:
                    for i in f1:
                        user,pwd = i.strip().split('|')
                        if username = user and password = pwd:
                            print('登录成功')
            				ret = f(*args,**kwargs)
                			return ret
                    return False
            return inner
        return wrapper
    
    @wrapper_out('qq')
    def qq():
        print('成功登录QQ')
    qq()
    @wrapper_out('tiktok')
    def tiktok():
        print('成功访问抖音')
    tiktok()
        
    

    多个装饰器装饰一个函数

    def wrapper1(func1):  # func1 = f原函数
        def inner1():
            print('wrapper1 ,before func')  # 2
            func1()
            print('wrapper1 ,after func')  # 4
        return inner1
    
    def wrapper2(func2):  # func2 = inner1
        def inner2():
            print('wrapper2 ,before func')  # 1
            func2()  # inner1
            print('wrapper2 ,after func')  # 5
        return inner2
    # 先执行离被装饰函数最近的装饰器,装饰器结束之后执行函数f()
    @wrapper2  # 第二步 f = wrapper2(f)  里面的f = inner1 / 外面的 f = inner2
    @wrapper1  # 第一步 f = wrapper1(f)  里面的f = func1 /  外面的 f = inner1
    def f():
        print('in f')  # 3
    f()  # inner2
    
  • 相关阅读:
    SuperMemo UX 添加笔记 Ctrl+H
    SuperMemo概念初识(摘录)
    win7安装office2013过程中出现 office 15 click-to-run extensibility component提示
    Automactically loading LSP files
    droppable的详细参数讲解
    PHP定时执行任务的实现
    随机数的妙用
    cursor的形状
    ajax防止重复提交请求1
    使用JS截取字符串函数详解
  • 原文地址:https://www.cnblogs.com/Agoni-7/p/11086781.html
Copyright © 2020-2023  润新知