函数之装饰器

装饰器

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)
    
posted @ 2019-12-13 10:11  阿浪阿浪  阅读(120)  评论(0编辑  收藏  举报