zoukankan      html  css  js  c++  java
  • 函数之装饰器

    装饰器

    1,开放封闭原则

    • 定义:对修改封闭,对扩展开放

    2,装饰器

    • 作用:在不修改源码及函数调用方式的前提下对函数进行扩展-

    • def wrappee(f):    #f被装饰的函数名
      	def innner(*args,**kwargs):
      		装饰之前的操作
      		f(*args,**kwargs)
      		装饰之后的操作
      		return 装饰之后的返回值
      	return inner
      @wrapper    ###想当于:func=wrapper(func)
      def func(*args,**kwargs):
      	print(f'xxx{args}xxx')
      	return
      func('要传的实参')
      	
      
    • @wrapper:语法糖

    有参装饰器

    • 在装饰器的基础上再套上一层

    • login_dic = {
          "username": None,
          "flag": False
      }
      # 正确的案例
      msg = """
      QQ
      微信
      邮箱
      """
      chose = input(msg).upper()
      
      def auth(argv):
          def wrapper(func):
              def inner(*args,**kwargs):
                  if login_dic["flag"]:
                      func(*args,**kwargs)
                  else:
                      if argv == "QQ":
                          print("欢迎登陆QQ")
                          user = input("username:")
                          pwd = input("password:")
                          if user == "alex" and pwd == "alex123":  # qq
                              login_dic["flag"] = True
                              login_dic["username"] = user
                              func(*args,**kwargs)
                          else:
                              print("用户名或密码错误!")
                      elif argv == "微信":
                          print("欢迎登陆微信")
                          user = input("username:")
                          pwd = input("password:")
                          if user == "1351101501" and pwd == "alex":  # 微信
                              login_dic["flag"] = True
                              login_dic["username"] = user
                              func(*args, **kwargs)
                          else:
                              print("用户名或密码错误!")
                 
                      
      
              return inner
          return wrapper
      @auth("QQ")
      def foo():
          print("这是一个被装饰的函数")
      
      # wrapper = auth(chose)
      # foo = wrapper(foo)
      foo()
      """
      # @auth(chose) 相等于以下两行代码的解构
      # wrapper = auth(chose)
      # foo = wrapper(foo)
      """
      

    多装一装饰器

    • 多个装饰器装饰一个函数

    • 先执行离被装饰的函数最近的语法糖

    • 小技巧:进入装饰器从上往下,走到最后一个装饰器执行被装饰的函数,退出装饰从下往上走

    • # def wrapper1(func):
      #     def inner1(*args,**kwargs):
      #         print(1)
      #         func(*args,**kwargs)
      #         print(11)
      #     return inner1
      #
      # def wrapper2(func):  # func == foo
      #     def inner2(*args,**kwargs):
      #         func(*args, **kwargs)
      #         print(22)
      #     return inner2
      #
      # def wrapper3(func):
      #     def inner3(*args,**kwargs):
      #         print(3)
      #         func(*args, **kwargs)
      #         print(33)
      #     return inner3
      
      # @wrapper1  # 1 11
      # @wrapper3  # 3 33
      # @wrapper2  #  8 22
      
      # def foo():
      #     print(8)
      
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    IOS 两种控制器的使用,纯代码UITabBarController 与 UINavigationController
    iOS UI控件总结(全)
    IOS 参数string 转成url
    CocoaPods 的使用与一些异常情况的处理
    创建自己的 FrameWork(含demo)-Xcode7环境
    UITextView 一些属性的设置
    跳转第二弹
    iOS--登录注册页面-趣享-接口设计
    《大道至简》第一章阅读笔记
    软件工程个人作业02
  • 原文地址:https://www.cnblogs.com/daviddd/p/12033625.html
Copyright © 2011-2022 走看看