zoukankan      html  css  js  c++  java
  • 装饰器的使用原理

     

      装饰器

      一、装饰器的定义

      二、装饰器的使用

      三、装饰器的语法以及最终语法

      四、有参有反函数被装饰

      五、带参函数被装饰

      一、装饰器:

      定义:名字上来看,就是用来装饰的东西

         从使用上来看,用来‘装饰’其他函数的函数,可以在原先函数功能基础上添加新的功能

      

    """
    ef wrap(tag):
        def fn():
            tag()
            print('绘画:进行观赏')
        return fn
    vase = wrap(vase)
    vase
    """
    
    def vase():
        print('插花')
    
    # 下方的函数嵌套结构就是装饰器
    def wrap(tag):
        def fn():
            tag()  # 原有的vase
            print('绘画:进行观赏')
        return fn  # 拓展功能后的vase
    vase = wrap(vase)  # 将拓展功能后的功能函数重新赋值给vase
    

      

      二、装饰器使用原则

      

      1.不能修改被装饰对象(函数)的源代码(封闭)
      2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放)
      三、基本体和笑笑语法
      
    最终语法:
    def wrap(fn): def inner(*args, **kwargs): print('前增功能') result = fn(*args, **kwargs) print('后增功能') return result return inner

      

    @wrap
    def fn1():
        print('fn1的原有功能')
    @wrap
    def fn2(a, b):
        print('fn2的原有功能')
    @wrap   
    def fn3():
        print('fn3的原有功能')
        return True
    @wrap
    def fn4(a, *, x):
        print('fn4的原有功能')
        return True
    
    fn1()
    fn2(10, 20)
    fn3()
    fn4(10, x=20)
    

      案列:

      

    def wrap(fn):
        def inner():
            fn()
            print('摆放功能')
        return inner
    
    
    # 语法糖 | 笑笑语法
    @wrap
    @outer  # <==> vase = outer(vase)
    def vase():
        print('插花')
    # vase = outer(vase)
    
    vase()

      

      四、带参装饰器:了解

      

    # 增加一个账号处理功能:3位及以上英文字符或汉字
    
    
    def check_usr(fn):
        def inner(usr, pwd):
            if not (len(usr) >= 3 and usr.isalpha()):
                print('账号验证失败')
                return False
            result = fn(usr, pwd)  # login
            return result
        return inner
    
    # 增加一个密码处理功能:6位及以上英文和数字
    def check_pwd(fn):
        def inner(usr, pwd):
            if not (len(pwd) >= 6 and pwd.isalnum()):
                print('密码验证失败')
                return False
            return fn(usr, pwd)
        return inner
    
    # 登录功能
    @check_usr  # login = check_usr(login) = inner
    @check_pwd
    def login(usr, pwd):
        if usr == 'abc' and pwd =='123qwe':
            print('登录成功')
            return True
        print('登录失败')
        return False
    
    res = login('abc', '123qwe')  # inner
    print(res)

      五、有参有反装饰函数

      

    # 了解
    def outer(input_color):
        def wrap(fn):
            if input_color == 'red':
                info = '33[36;41mnew action33[0m'
            else:
                info = 'yellow:new action'
    
            def inner(*args, **kwargs):
                pass
                result = fn(*args, **kwargs)
                print(info)
                return result
            return inner
        return wrap  # outer(color) => wrap
    
    color = input('color: ')
    @outer(color)  # @outer(color) ==> @wrap  # func => inner
    def func():
        print('func run')

        

      

    # 了解
    def outer(input_color):
        def wrap(fn):
            if input_color == 'red':
                info = '33[36;41mnew action33[0m'
            else:
                info = 'yellow:new action'
    
            def inner(*args, **kwargs):
                pass
                result = fn(*args, **kwargs)
                print(info)
                return result
            return inner
        return wrap  # outer(color) => wrap
    
    color = input('color: ')
    @outer(color)  # @outer(color) ==> @wrap  # func => inner
    def func():
        print('func run')
    
    func
  • 相关阅读:
    读取美团购
    获取enum的Description
    获取手机号码所在地
    手动添加XA/XD的端口和磁盘映射
    无法使用SQL Server Management Studio的找到Network Server
    [XenDesktop5.5]+HyperV上的Win7+VDA无法启用Aero效果
    傻瓜式设置WANem配置 (点对点网络设置)
    [XD5.5]如何关闭XD的Audio UDP通道
    使用TCP方式登陆OCS
    在Linux上建立文件夹指向在Win共享的文件夹
  • 原文地址:https://www.cnblogs.com/mofujin/p/10646151.html
Copyright © 2011-2022 走看看