码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器

时间:2018-12-27 22:47:41      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:else   目标   返回   inner   输入密码   username   执行   返回值   对不起   

 装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
    通用装饰器语法:

    def wrapper(fn):
        def inner(*args, **kwargs): # 聚合
            在目标函数之前
            ret = fn(*arg, **kwargs) # 打散
            在目标函数之后
            return ret
        return inner

    @wrapper
    def func():
        pass

    func()

  

带参数的装饰器
def wrapper_out(参数):
            def wrapper(fn):
                def inner(*args, **kwargs): # 聚合
                    在目标函数之前
                    ret = fn(*arg, **kwargs) # 打散
                    在目标函数之后
                    return ret
                return inner
            return wrapper

        @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
        def func():
            pass

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

# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
    print("我是可怜的func")

func()
# 1 2 3  func 3 2 1

  装饰器的应用

menu = ("查看", "添加", "修改", "删除", "退出")

flag = False  # 没登录


def login():
    global flag
    username = input("请输入用户名:")
    password = input("请输入密码:")
    if username == "alex" and password == "123":
        flag = True
        print("登录")
    else:
        flag = False
        print("用户名密码错误")


# 登录验证装饰器
def login_verify(fn):
    def inner(*args, **kwargs):
        # 登录校验
        while 1:
            if flag == True:
                ret = fn(*args, **kwargs)
                return ret
            else:
                print(‘对不起, 您还没有登录‘)
                login()
    return inner

def chakan():
    print("==============================查看")

@login_verify
def tianjia():
    print("============================添加")

@login_verify
def xiugai():
    print("=======================修改")

@login_verify
def shanchu():
    print("=========================删除")


while 1:
    for i in range(len(menu)):
        print(i+1, menu[i])

    num = input("请输入你要执行的菜单:")
    if num == "1":
        chakan()
    elif num == "2":
        tianjia()
    elif num == "3":
        xiugai()
    elif num == "4":
        shanchu()
    elif num == "5":
        print("程序退出中..........")
        exit()
    else:
        print("输入有误. 请重新选择!")

  



装饰器

标签:else   目标   返回   inner   输入密码   username   执行   返回值   对不起   

原文地址:https://www.cnblogs.com/YangWenYu-6/p/10187572.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!