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)
      
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
    【POJ 2152】 Fire (树形DP)
    【POJ 1741】 Tree (树的点分治)
    【POJ 2486】 Apple Tree (树形DP)
    【HDU 3810】 Magina (01背包,优先队列优化,并查集)
    【SGU 390】Tickets (数位DP)
    【SPOJ 2319】 BIGSEQ
    【SPOJ 1182】 SORTBIT
    【HDU 5456】 Matches Puzzle Game (数位DP)
    【HDU 3652】 B-number (数位DP)
  • 原文地址:https://www.cnblogs.com/daviddd/p/12033625.html
Copyright © 2011-2022 走看看