Python day15装饰器基本理论,以及结合全局变量模拟session

  装饰器(decorator):为其他函数添加附加功能

原则:1.不修改被修饰函数源代码

   2.不修改被修饰函数的调用方式

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

import time
def timmer(func):
    def wapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('函数运行时间是%s'%(stop_time-start_time))
        return res
    return wapper
@timmer
def cal(l):
    start_time=time.time()
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    stop_time=time.time()

cal(range(100))

上述代码是一个装饰器案例,可能看不懂,下面分成三部分进行讲解

1.高阶函数

  接收一个函数或者返回一个函数都称为高阶函数

例如:

def foo():
    print("你好")

def test(func):
    print(func)
    func()

test(foo)

2.函数中嵌套定义另一个函数,叫函数嵌套

3.嵌套函数各自封闭参数,叫做函数的闭包

 

装饰器的基本框架

def timmer(func):
    def wrapper():
        func()
    return wrapper

# 传入函数,返回嵌套函数
# 嵌套函数中传入原函数构成装饰器

这样在不改变源代码的情况下,能够增加或者修改原函数,下面在函数的上方用@timmer进行调用即可

 

将装饰器中传入*args可变参数和**kwargs可变关键字参数,即可做成万用的函数装饰器

 

例子2   制作验证装饰器

def auth_func(func):
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
        username=input('用户名:').rstrip()
        password=input('密码:').rstrip()
        if (username=='nnn' and password =='123'):
            res=func(*args,**kwargs)
            return res
        else:
            return print('密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎来到京东')

@auth_func
def home(name):
    print('个人家园%s'%name)

@auth_func
def shoppingcart(name):
    print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜'))

index()
home("littlepage's home")
shoppingcart('littlepage')

上方代码是一个验证装饰器,在函数前加上@可调用装饰器

 

再加上前面学习的全局变量,则可以模拟session

usr_dictionary={'username':None,'login':False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
        username=input('用户名:').rstrip()
        password=input('密码:').rstrip()
        if usr_dictionary['username'] and usr_dictionary['login']:
            res=func(*args,**kwargs)
        if (username=='nnn' and password =='123'):
            res=func(*args,**kwargs)
            return res
        else:
            return print('密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎来到京东')

@auth_func
def home(name):
    print('个人家园%s'%name)

@auth_func
def shoppingcart(name):
    print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜'))

index()
home("littlepage's home")
shoppingcart('littlepage')

 

posted @ 2018-07-31 20:15  SteveYu  阅读(294)  评论(0编辑  收藏  举报