装饰器的使用原理

 

  装饰器

  一、装饰器的定义

  二、装饰器的使用

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

  四、有参有反函数被装饰

  五、带参函数被装饰

  一、装饰器:

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

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

  

"""
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
原文地址:https://www.cnblogs.com/mofujin/p/10646151.html