• python之装饰器


    python之装饰器

    一.定义:在不破坏原有函数和原有函数调用的基础上. 给函数添加新的功能
    def wrapper(fn):
         def inner(*args, **kwargs): # 聚合
               在目标函数之前
                ret = fn(*arg, **kwargs) # 打散
                在目标函数之后
                return ret
            return inner
    @wrapper
    def func():
          pass
    func()  

    二. 同一个函数被多个装饰器装饰(举例说明)

    def wrapper1(fn):
        def inner(*args, **kwargs):
            print("1111111")
            ret = fn(*args, **kwargs)
            print("2222222")
            return ret
        return inner
    
    def wrapper2(fn):
        def inner(*args, **kwargs):
            print("3333333")
            ret = fn(*args, **kwargs)
            print("44444444")
            return ret
        return inner
    
    def wrapper3(fn):
        def inner(*args, **kwargs):
            print("555555")
            ret = fn(*args, **kwargs)
            print("666666")
            return ret
        return inner
    
    
    # 就近原则
    @wrapper1
    @wrapper2
    @wrapper3
    def func():
        print("我是可怜的func")
    
    func()
    # 1 2 3  func 3 2 1

    三. 带参数的装饰器

    def wrapper_out(参数):
        def wrapper(fn):
            def inner(*args, **kwargs): # 聚合
                在目标函数之前
                 ret = fn(*arg, **kwargs) # 打散
                 在目标函数之后
                  return ret
             return inner
         return wrapper
    @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
    def func():
         pass
    

     

    # def wrapper_out(flag): # 装饰器本身的参数
    #     def wrapper(fn): # 目标函数
    #         def inner(*args, **kwargs): # 目标函数执行需要的参数
    #             if flag == True:
    #                ret = fn(*args, **kwargs) # 在执行目标函数之前
    #                return ret
    #             else:
    #                 ret = fn(*args, **kwargs)  # 在执行目标函数之前
    #                 return ret
    #         return inner
    #     return wrapper
    #
    #
    # # 语法糖 @装饰器
    # @wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器
    # def func(): # 被 wrapper装饰
    #     print("啦啦啦")
    #
    #func()
    

     四.装饰器的应用

    menu = ("查看", "添加", "修改", "删除", "退出")
    
    flag = False # 没登录
    
    
    def login():
        global flag
        username = input("请输入用户名:")
        password = input("请输入密码:")
        if username == "alex" and password == "123":
            flag = True
            print("登录")
        else:
            flag = False
            print("用户名密码错误")
    
    
    # 登录验证装饰器
    def login_verify(fn):
        def inner(*args, **kwargs):
            # 登录校验
            while 1:
                if flag == True:
                    ret = fn(*args, **kwargs)
                    return ret
                else:
                    print('对不起, 您还没有登录')
                    login()
        return inner
    
    def chakan():
        print("==============================查看")
    
    @login_verify
    def tianjia():
        print("============================添加")
    
    @login_verify
    def xiugai():
        print("=======================修改")
    
    @login_verify
    def shanchu():
        print("=========================删除")
    
    
    while 1:
        for i in range(len(menu)):
            print(i+1, menu[i])
    
        num = input("请输入你要执行的菜单:")
        if num == "1":
            chakan()
        elif num == "2":
            tianjia()
        elif num == "3":
            xiugai()
        elif num == "4":
            shanchu()
        elif num == "5":
            print("程序退出中..........")
            exit()
        else:
            print("输入有误. 请重新选择!")
    

      

     

     

  • 相关阅读:
    《大道至简》读后有感
    关于jQuery放置位置的问题01
    javascript基础
    层叠样式表与css3基础
    经典sql语句
    java开发中的23种设计模式
    struts2漏洞以及测试
    离开贴吧大概会写下博客吧
    Set介绍
    小知识点
  • 原文地址:https://www.cnblogs.com/l1222514/p/10121388.html
Copyright © 2020-2023  润新知