Python装饰器

1. 装饰器

装饰器的作用就是在不修改源代码,通过添加注解的方式实现功能的扩展。

下面以给boy(),girl(),luxury()业务方法添加登录方法为例,通过添加注解实现功能扩展(闭包),添加注解本质是返回了一个嵌套函数内部函数的内存地址,由于不同业务方法传入的参数不同,所以需要在嵌套函数的内部添加 *args,**kwargs来接收不同类型的非固定参数。

account = {
    "username": "kelly", # 用户登录了就把这个改成True
    "password": "LiJun123@", # 假装这是DB里存的用户信息
    "auth": False   # 假装这是DB里存的用户信息
}

def login(fuc):
    def inner(*args, **kwargs):  # 再定义一层函数
        if account["auth"] is False:
            username = input("user:")
            password = input("pasword:")
            if username == account["username"] and password == account["password"]:
                print("welcome login....")
                account["auth"] = True
            else:
                print("wrong username or password!")
        if account["auth"] is True:
            fuc(*args, **kwargs)
    return inner  # 注意这里只返回inner的内存地址,不执行


def home():
    print("-----欢迎来到首页-----")


def girl():
    print("-----欢迎来到女装板块------")


@login
def boy():
    print("-----欢迎来到男装板块------")


@login
def luxury(vip):
    if vip > 3:
        print("-----欢迎来到奢侈品vip区------")
    else:
        print("----欢迎来到普通奢侈品区-------")


home()
# luxury=login(luxury) # 这次执行login返回的是inner的内存地址 .inner at 0x101762840>
# boy=login(boy) # .inner at 0x102562840> 这句话可以在boy方法上简写成@login
luxury(4)
boy()

2.装饰器运行结果

不同的业务函数可以传入不同的参数,本质是因为嵌套函数内部添加了两个不固定参数实现的扩展,由于luxury()传入的参数>3,所以会打印"欢迎来到奢侈品vip区",boy()没有传入任何参数,也就没有判断之分,直接打印"欢迎来到男装板块"

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值