Python之装饰器

一、装饰器

  本质就是函数,功能是为其他函数添加附加功能

 

二、原则

  1.不修改被修饰函数的源代码

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

 

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

  1.高阶函数:

    ①函数接收的参数是一个函数名

    ②函数的返回值是一个函数名

    ③满足上述条件任意一个,都可以称之为高阶函数

      *** 高阶函数示范 ***  

      *** 把函数当成参数传给高阶函数 ***

      *** 函数返回值是函数名 ***

# 函数接收的参数是一个函数名
def
say_hi(): import time print('欢迎光临') time.sleep(3) print('谢谢惠顾') def test(func): import time print(func) #输出的是函数的地址 start_time = time.time() func() stop_time = time.time() print('函数运行时间是%s' %(stop_time-start_time)) test(say_hi)
#函数的返回值是一个函数名
def
say_hi(): import time print('欢迎光临') time.sleep(3) print('谢谢惠顾') def test(func): return func res = test(say_hi) print(res) say_hi()

 

    # 高阶函数总结:

      1)函数接收的参数是个函数名

        作用:在不移动函数源代码的前提下,为函数添加新功能

        不足:会改变函数的调用方式

      2)函数的返回值是一个函数名

        作用:不修改函数的调用方式

        不足:不能添加新功能

四、装饰器的框架

def test(func):
    def wrapper(*args,**kwargs): 
    res = func(*args,**kwargs) 
    return res
  return wrapper()

五、使用案例-计算函数运行时间

import time
def JiShi(f):
    def wapper(*args,**kwargs):
        start_time = time.time()
        res = f(*args,**kwargs)
        stop_time = time.time()
        print('函数运行时间是:%s' %(stop_time - start_time))
        return res
    return wapper

def JiShi_mistake(f):   #使用这个会报错,因为函数的参数没有进入
    def wapper():
        start_time = time.time()
        res = f()
        stop_time = time.time()
        print('函数运行时间是:%s' % (stop_time - start_time))
        return res
    return wapper

@JiShi
def test(name,age):
    import time
    time.sleep(1)
    print('test函数运行完毕...\n名字是:%s \n年龄是:%s' %(name,age))
    return '这是test的返回值'

j = test('alex',18)
print(j)

 六、使用案例-网页账号密码登录验证

#!/usr/bin/env python
# -*- coding:utf8 -*-

'''
    为了在进入网站登录一次后,让用户不用多次输入账号密码
        让机器记住登录状态,可以让用户不用多次登录

        #### 第一种样式 ####
            # 判别一个账号
                ==》 设置全局变量:
                    user_dic = {'user_name':None,'login':False}
                ==》 在装饰器前面加上:
                    if user_id['user_name'] and user_id['login']:
                        res = func(*args,**kwargs)
                        return res
                ==》在判断账号密码是否正确的if里面加上:
                    user_id['user_name'] = user_name
                    user_id['login'] = True

        #### 第二种样式 ####
            # 判别多个账号
                ==》定义全局变量  用户信息列表(内部放字典) 和 当前登录状态
                    user_list = [
                        {'name':'alex','passwd':'123'},
                        {'name':'kajsd','passwd':'123'},
                        {'naem':'sfsa','passwd':'123'},
                        {'name':'aasd','passwd':'123'},
                    ]
                    current_dic = {'user_name':None,'login':False}
                ==》 判断当前状态
                            if current_dic['user_name'] and current_dic['login']:
                                # 即 current_dic['user_name'] 和 current_dic['login'] 都不为空,或Fla时
                                res = func(*args,**kwargs)
                                return res
                ==》将 if user_name == '产品经理' and passwora == '123456': 部分
                    全部改写成 for 循环,遍历  用户信息列表


'''

# #### 第一种样式 ####
# user_dic = {'user_name':None,'login':False}
#
# def quth_func(func):
#     def wrapper(*args,**kwargs):
#         if user_dic['user_name'] and user_dic['login']:
#             # 即 user_dic['user_name'] 和 user_dic['login'] 都不为空,或Fla时
#             res = func(*args,**kwargs)
#             return res
#         user_name = input('用户名:').strip()
#         password = input('密码:').strip()
#         if user_name == '产品经理' and password == '123456':
#             user_dic['user_name'] = user_name
#             user_dic['login'] = True
#             res = func(*args,**kwargs)
#             return res
#         else:
#             print('用户名或密码错误')
#     return wrapper

#### 第二种样式 ####
user_list = [
    {'name':'alex','passwd':'123'},
    {'name':'kajsd','passwd':'123'},
    {'naem':'sfsa','passwd':'123'},
    {'name':'aasd','passwd':'123'},
]

current_dic = {'user_name':None,'login':False}

def quth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['user_name'] and current_dic['login']:
            # 即 current_dic['user_name'] 和 current_dic['login'] 都不为空,或Fla时
            res = func(*args,**kwargs)
            return res
        user_name = input('用户名:').strip()
        password = input('密码:').strip()
        for user_dic in user_list:
            if user_name == user_dic['name'] and password == user_dic['passwd']:
                current_dic['user_name'] = user_name
                current_dic['login'] = True
                res = func(*args, **kwargs)
                return res
        else:
            # else  跟 for 连接在一起
            print('用户名或密码错误')
    return wrapper


@quth_func
def home(name):
    print('欢迎回家%s' %name)

@quth_func
def index():
    print('欢迎来到主页')

@quth_func
def shopping_cai():
    print('购物车里有 %s,%s,%s' %('牛奶','面包','零食'))

home('产品经理')
shopping_cai()
index()

 

posted @ 2019-05-02 13:04  Jony-2018  阅读(155)  评论(0编辑  收藏  举报