day14装饰器

1.什么是装饰器
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能

2.装饰器需要遵循的原则
不修改被装饰函数的源代码(开放封闭原则)
为被装饰函数添加新功能后,不修改被修饰函数的调用方式

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

4.高阶函数定义:
函数接收的参数是一个函数名
函数的返回值是一个函数名
满足上述条件任意一个,都可称之为高阶函数

def foo():
    print('我的函数名作为参数传给高阶函数')
def gao_je1(func):
    #函数名所在的内存地址
    print('我就是高阶函数1,我接收的函数名是%s'%func)
    func()#执行传入的函数
def gao_jie2(func):
    #函数名所在的内存地址
    print('我就是高阶函数2,我的返回值是%s'%func)
    return func()#返回执行高阶函数

gao_je1(foo)#将函数名传给gao_je1
gao_jie2(foo)#将函数名传给gao_jie2

5.我们确实没有改变foo的调用方式,但是我们也没有为foo
增减新的功能

import time
def foo():
    print('from the foo')

def timmer(func):
    start_time = time.time()
    return func
    stop_time = time.time()
    print('函数%s,运行时间是%s'%(func,start_time-

start_time))

timmer(foo)
foo()
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

6.函数的嵌套

def father(name):
    print('from father %s'%name)
    def son:
        print('from son')
        def grandson():
            print('from grandson')
        grandson()
    son()
father('林海峰')

7.闭包:在一个作用域里定义变量,相当于打了个包

def father(name):
    def son:
        print('我爸爸是【%s】'%name)
        def grandson():
            print('我爷爷是【%s】'%name)
        grandson()
    son()
father('raetyu')

8.装饰器的基本架子

def timer(func):
    def wrapper():
        return wrapper

9.加上参数

def timer(func):
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
        return wrapper

10.加上功能

import time
def timer(func):
     def wrapper(*args,**kwargs):
         start_time=time.time()
         func(*args,**kwargs)
         stop_time=time.time()
         print('函数[%s],运行时间是[%s]' 

%(func,stop_time-start_time))
     return wrapper

11.加上返回值

 

import time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('函数【%s】,运行时间
%s】'%(func,start_time-stop_time))
        return res
    return wrapper

def cal(array):
    res=0
    for i in array:
        res+=i
    return res
cal=timer(cal)
cal(range(10))

@timer#@timer就等同于cal=timer(cal)
def cal(array):
    res=0
    for i in array:
        res+=i
    return res
cal=(range(10))

12.无带参修饰

user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]
current_user={'username':None,'login':False}
#认证功能
def auth_deco(func):
    def wrapper(*args,**kwargs):
        if current_user['username'] and current_user

['login']:
            res=func(*args,**kwargs)
            return res#返回被修饰函数,不然在内存中会

消失
        username=input('用户名:').strip()#删除头尾指

定的空字符
        passwd=input('密码:').strip()

        for index,user_dic in enumerate(user_list):
            if username == user_dic['name'] and 

passwd == user_dic['passwd']:
                current_user['username']=username
                current_user['login']=True
                res=func(*args,**kwargs)
                return res
            else:
                print('用户名和密码错误,重新登录')
    return wrapper
@auth_deco
def index():
    print('欢迎来到主页面')

@auth_deco
def home():
    print('这里是你家')

def shopping_car():
    print('查看购物车啊亲')

def order():
    print('查看订单啊亲')

print(user_list)
index()
print(user_list)

13.带参修饰

user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]

current_user={'username':None,'login':False}
def auth(auth_type='file'):#函数套在最后一层,只能套用这个函数
    def auth_deco(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                if current_user['username'] and current_user['login']:
                    res=func(*args,**kwargs)
                    return res
                username=input('用户名: ').strip()
                passwd=input('密码: ').strip()

                for index,user_dic in enumerate(user_list):
                    if username == user_dic['name'] and passwd == user_dic['passwd']:
                        current_user['username']=username
                        current_user['login']=True
                        res=func(*args,**kwargs)
                        return res
                        break
                else:
                    print('用户名或者密码错误,重新登录')
            elif auth_type == 'ldap':
                print('巴拉巴拉小魔仙')
                res=func(*args,**kwargs)
                return res
        return wrapper
    return auth_deco


#auth(auth_type='file')就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type='file')
#就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type='file'参数
@auth(auth_type='ldap')认证类型的选择功能
def index():
    print('欢迎来到主页面')

@auth(auth_type='ldap')
def home():
    print('这里是你家')

def shopping_car():
    print('查看购物车啊亲')

def order():
    print('查看订单啊亲')

# print(user_list)
index()
# print(user_list)
home()

 

posted @ 2018-09-12 16:20  杜阿明  阅读(49)  评论(0)    收藏  举报