day 15 装饰器

关于函数的装饰器

1.装饰器

1.1装饰器的作用?

不改变函数的功能和调用方式的情况下添加新的功能

装饰器遵守开放封闭原则:

            对功能的扩展开放

            对代码的修改是封闭

1.2装饰器语法:   

函数版:  

def wrapper(fn):
            def inner(*args, **kwargs): # 聚合
                在目标函数之前   #可自定义任何语法
                ret = fn(*arg, **kwargs) # 打散
                在目标函数之后    #可定义任何语法
                return ret
            return inner
View Code

 语法糖版:

@wrapper
        def func():
            pass

        func()
View Code

 

2.带有参数的装饰器

def wrapper_out(flag):
    def wrapper(fn):
        def inner(*args,**kwargs):
            if flag == True:
                ret = fn(*args, **kwargs)
                return ret
            else:
                print("问问金老板行情怎么样?")
                ret = fn(*args, **kwargs)
                print("金老板骗人!")
                return ret
        return inner
    return wrapper


@wrapper_out(False)
def yue():
    print("走啊,约起!")
yue()
View Code

 

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

#先定义多个装饰器
def wrapper1(fn):
    def inner(*args,**kwargs):  #打散
        print("11111")
        ret = fn(*args,**kwargs) #聚合
        print("22222")
        return ret
    return inner

def wrapper2(fn):
    def inner(*args,**kwargs):  #打散
        print("333333")
        ret = fn(*args,**kwargs) #聚合
        print("444444")
        return ret
    return inner

def wrapper3(fn):
    def inner(*args,**kwargs):  #打散
        print("555555")
        ret = fn(*args,**kwargs) #聚合
        print("666666")
        return ret
    return inner

#定义被装饰的函数
@wrapper1
@wrapper2
@wrapper3
def func():
    print("我是被装饰的函数")
func()

####结果#####
11111
333333
555555
我是被装饰的函数
666666
444444
22222
#就近原则,会依次从下到上的去执行装饰器
View Code

 

4.装饰器的应用

登录校验

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("输入有误. 请重新选择!")
View Code

 

转载于:https://www.cnblogs.com/yanpeizhang/p/10309661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值