【python第四篇】装饰器

一.装饰器

1.本质就是一个函数,功能是为其他函数添加附加功能

2.原则:1.不修改被修饰函数的源代码;2.不修改被修饰函数的调用方式

3.装饰器=高阶函数+函数嵌套+闭包

3.1高阶函数:1.函数接收的参数是一个函数名;2.函数的返回值是一个函数名==满足上述任意一个条件,都可以称之为高阶函数

3.2 函数闭包装饰器基本实现

def timmer(func):  #func=test
    def wrapper():
        s_time=time.time()
        func()  #就是在运行test()
        t_time=time.time()
        print ("运行时间%s"%(t_time-s_time))
    return wrapper

@timmer   #语法糖,相当于test=timmer(test)
def test():
    time.sleep(3)
    print ("运行完毕")
test()  #执行的就是wrapper

3.3  函数闭包加上返回值

import time
def timmer(func):
    def wrapper():
        s_time=time.time()
        res=func()
        t_time=time.time()
        print ("运行时间%s"%(t_time-s_time))
        return res
    return wrapper

@timmer
def test():
    time.sleep(3)
    print ("运行完毕")
    return("这是test返回值")
res=test()
print (res)

3.4函数闭包加上参数

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        s_time=time.time()
        res=func(*args,**kwargs)
        t_time=time.time()
        print ("运行时间%s"%(t_time-s_time))
        return res
    return wrapper

@timmer
def test(name,age):
    time.sleep(3)
    print ("运行完毕")
    return("这是test返回值")
res=test("lex",18)
print (res)

3.5 函数闭包补充:解压序列

#取序列中首尾两个值
l=[1,7,8,5,34567,56,34,57]
a,*_,c=l
print(a)
print(c)
#取序列中第一个和第二个,最后一个和倒数第二个的两个值
a,b,*_,c,d=l
print(a)
print(b)
print(c)
print(d)

#交换两个元素的值
x=1
y=2
x,y=y,x
print(x)
print(y)

3.6函数闭包为函数加上认证功能

def  auth_func(func):
    def wrapper(*args,**kwargs):
        username=input("用户名:").strip()
        password=input("密码:").strip()
        if (username=="sb")and (password =="123"):
              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_car(name):
    print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))

index()
home("小东")
shopping_car("小东")

3.7 函数闭包模拟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()
        password=input("密码:").strip()
        if (username=="sb")and (password =="123"):
              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_car(name):
    print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))

index()
home("小东")
shopping_car("小东")

3.8 函数闭包模拟session(多个用户名和密码的校验)

user_list=[{"username":"Alex","password":"13"},
           {"username":"sb","password":"139"},
           {"username":"as","password":"13"}]

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()
        password=input("密码:").strip()
        for i in user_list:
            if username==i["username"] and password==i["password"]:

              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_car(name):
#     print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))
#
# index()
# home("小东")


print("before---",user_dic)
index()
print("after---",user_dic)

3.9 函数闭包带参数装饰器

user_list=[{"username":"Alex","password":"13"},
               {"username":"sb","password":"139"},
               {"username":"as","password":"13"}]

user_dic={"username":None,"login":False}
def auth(auth_type="filedb"):
    def  auth_func(func):
        def wrapper(*args,**kwargs):
            print("认证类型是:",auth_type)
            if auth_type=="filedb":
                if user_dic["username"] and user_dic["login"]:
                    res=func(*args,**kwargs)
                    return res
                username=input("用户名:").strip()
                password=input("密码:").strip()
                for i in user_list:
                    if username==i["username"] and password==i["password"]:

                      user_dic["username"]=username
                      user_dic["login"]= True
                      res=func(*args,**kwargs)
                      return res
                else:
                    print("登录失败")
            elif auth_type=="bb":
                print("开始bb")
                res=func(*args,**kwargs)
                return res
            elif auth_type=="cc":
                print("开始cc")
                res=func(*args,**kwargs)
                return res

        return wrapper
    return auth_func


@auth(auth_type="filedb")
def index():
    print("欢迎来到京东")
@auth(auth_type="bb")
def home(name):
    print("%s欢迎回家"%name)
@auth(auth_type="cc")
def shopping_car(name):
    print("%s购物车里有[%s,%s]"%(name,"奶茶","可乐"))

index()
home("小东")
shopping_car("小东")

  

  

  

 

posted @ 2020-03-08 22:12  云小丫丫  阅读(81)  评论(0)    收藏  举报