一以贯之

python:带参数的装饰器,函数的有用信息

一、带参数的装饰器,函数的有用信息

 

def func1():
    '''此函数的功能是完成的登陆的功能
    return: 返回值是登陆成功与否(true,false)
    '''

    print(333)

func1()
print(func1.__name__)#func1
print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否

   打印函数名

from functools import wraps
def wrapper(f):
    @wraps(f)
    def inner(*args,**kwargs):
        #函数运行之前的操作 ret = f(*args,**kwargs)
        #执行函数之后的操作 name = f.__name__ print(name) return ret return inner @wrapper def func1(): print(666) func1()

  二、带参数的装饰器

 

 

 

给每个函数写一个记录日志的功能,

功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。

所需模块:

import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

 

import time
def wrapper(func):
    def inner(*args,**kwargs):
        struct_time = time.localtime()
        time_now = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
        with open('log',encoding = 'utf-8',mode = 'a')as f:
            f.write('在%s时间,执行了%s函数\n'%(time_now,func.__name__))
            ret = func(*args,**kwargs)
            '''函数操作之后'''
            return ret

    return inner
@wrapper
def func1():
    print(6660)
func1()

  

 

 

 

 

在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:

      设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。

      设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。

      循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。

      供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。

相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

dic = {
    'username':None,
    'status':False,
}

def login(flag):
    def wrapper(func):
        def inner(*args,**kwargs):
            if dic['status']:
                ret = func(*args,**kwargs)
                return ret
            else:
                count  = 0
                while count<3:
                    username = input('请输入你的用户名:').strip()
                    password = input('请输入你的密码').strip()
                    with open('msg2',encoding = 'utf-8')as f:

                        msg_dic= eval(f.readline())

                        if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']:
                            dic['username'] = username
                            dic['status'] = True
                            ret = func(*args,**kwargs)
                            return ret
                        else:
                            print('您输入的用户名或者密码错误,请从新输入,还有%s次机会' %(2-count))
                            count+= 1
        return inner
    return wrapper


@login('微信')
def taobao_home():
    print('淘宝首页')


@login('qq')
def JD_home():
    print('京东首页')



choice_dict={
    1:taobao_home,
    2:JD_home,
}

while True:
    print('1  淘宝首页\n2 京东首页')
    choice_num = input('请选择输入的序号:').strip()
    if choice_num.isdigit():
        choice_num = int(choice_num)
        if 0 < choice_num <= len(choice_dict):
            choice_dict[choice_num]()
        else:
            print('请输入范围内的序号')
    else:
        print('您输入的有非法字符,请从新输入')

  

 

posted on 2018-04-10 21:53  凡夫or俗子  阅读(154)  评论(0编辑  收藏  举报