Python之装饰器---第十二天

1、装饰器
(1)本质:装饰器本质就是函数,为其他函数添加附加功能
(2)原则:

  • 不修改被 修饰函数的源代码
  • 不修改被修饰函数的调用方式

(3)装饰器结构
装饰器=高阶函数+函数嵌套+闭包
(4)装饰器举例:

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print("函数的运行时间是%s"%(stop_time-start_time))
        return res
    return wrapper

@timmer
def cal(l):
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    return res

res=cal(range(20))
print(res)

#输出结果:
函数的运行时间是2.046844005584717
190

*说明:@装饰器名相当于给装饰器赋值,装饰器后面还可以加参数,装饰的只是最外层函数
2、高阶函数定义
函数的参数是一个函数名,函数的返回值是一个函数名,满足以上其中一个就是高阶函数。
3、使用装饰器给函数加认证功能举例

def auth_func(func):
    def wrapper(*args,**kwargs):
        username=input("用户名:").strip()
        passwd=input("密码:").strip()
        if username=="lalala" and passwd=="lalala":
            res=func(*args,**kwargs)
            return res
        else:
            print("账号或密码错误")
    return wrapper

@auth_func
def index():
    print("欢迎来到京东主页")

@auth_func
def home(name):
    print("欢迎回家%s"%name)

@auth_func
def shopping(name):
    print("欢迎%s下次光临"%name)

index()
home("Alex")
shopping("Alex")

说明: 但是以上有个缺点,就是每点击一次界面,都需要输入账密,为了解决这个问题,可以用session优化,即登录一次验证后无需再次登录,代码如下:

user_dic={"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if user_dic["username"] and user_dic["login"]:
            res=func(*args,**kwargs)
            return res
        username=input("用户名:").strip()
        passwd=input("密码:").strip()
        if username=="lalala" and passwd=="lalala":
            user_dic["username"]=username
            user_dic["login"]=True
            res=func(*args,**kwargs)
            return res
        else:
            print("账号或密码错误")
    return wrapper

@auth_func
def index():
    print("欢迎来到京东主页")

@auth_func
def home(name):
    print("欢迎回家%s"%name)

@auth_func
def shopping(name):
    print("欢迎%s下次光临"%name)

index()
home("Alex")
shopping("Alex")

#输出结果:
用户名:lalala
密码:lalala
欢迎来到京东主页
欢迎回家Alex
欢迎Alex下次光临

再次优化,将账号密码放在一个列表里,代码如下:

user_list=[

    {"name":"123","passwd":"123"},
    {"name":"lalala","passwd":"lalala"},
    {"name":"666","passwd":"666"}

]

current_dic={"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic["username"] and current_dic["login"]:
            res=func(*args,**kwargs)
            return res
        username=input("用户名:").strip()
        passwd=input("密码:").strip()

        for user_dic in user_list:
            if username==user_dic["name"] and passwd==user_dic["passwd"]:
                current_dic["username"]=username
                current_dic["login"]=True
                res=func(*args,**kwargs)
                return res
        else:
            print("账号或密码错误")
    return wrapper

@auth_func
def index():
    print("欢迎来到京东主页")

@auth_func
def home(name):
    print("欢迎回家%s"%name)

@auth_func
def shopping(name):
    print("欢迎%s下次光临"%name)

index()
home("Alex")
shopping("Alex")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值