python 第十二天2018.04.01 带参数的装饰器,,函数的有用信息

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

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(‘您输入的有非法字符,请从新输入‘)

  

 

原文地址:https://www.cnblogs.com/jinfanfu/p/8747811.html

时间: 2024-10-13 00:06:37

python 第十二天2018.04.01 带参数的装饰器,,函数的有用信息的相关文章

Python带参数的装饰器

在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passing_arguments(function_to_decorate): def a_wrapper_accepting_arguments(arg1, arg2): print("I got args! Look:", arg1, arg2) function_to_decorate(ar

Python全栈__函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

1.函数的有用信息 代码1: 1 def login(username, password): 2 """ 3 此函数需要用户名,密码两个参数,完成的是登录的功能. 4 :return: True 登录成功. False登录失败. 5 """ 6 print(login.__name__) 7 print(login.__doc__) 8 print('登录成功...') 9 return True 10 11 print(login.__nam

python装饰器详解,多层装饰器,及带参数的装饰器。

pyhon学习有一段时间了,今天又碰到了Django的中间件,其实Django里面的中间件,就是用了多层的装饰器,然后去了解了一下多层装饰器,感觉有写东西差不多快忘了,也可能前面没学好. 现在重新记录,学习下. 普通装饰器: def warp(func): print('我是装饰器,碰到需要装饰的函数,一开始执行这里') def inner(*args, **kwargs): print('这里才是真正的装饰开始!') res = func(*args, **kwargs) print('装饰结

Python中带参数的装饰器

装饰器本身是用来是为一个函数是实现新的功能,并且不改变原函数的代码以及调用方式. 遇到这样一种问题: 众多函数调用了你写的装饰器,但客户有需求说,我想实现我可以随之控制装饰器是否生效. 那你就不可能在得到命令的时候去原函数头部去做删除和添加装饰器调用的命令.这是就可以用到带参数的装饰器,定义一个开关,调用装饰器的时候,把这个装饰器的开关参数给传递进去,这样当开关打开的时候装饰器生效,关闭的时候则只执行原函数的代码. 举例:开关参数为True的时候执行过程: 1 F = True #step 1

22_装饰器、带参数的装饰器、多个装饰器装饰一个函数

一.装饰器的执行流程 1 def wrapper(func): 2 def inner(*args,**kwargs): 3 ret = func(*args,**kwargs) 4 return ret 5 return inner 6 7 @wrapper #fun = wrapper(fun) 8 def fun(s): 9 print('666') 10 return s 11 12 fun('777') 13 print(fun('777')) 14 15 ''' 16 1.程序至上而

带参数的装饰器,多个装饰器装饰一个函数,函数的有用信息。

带参数的装饰器.import time def timer_out(flag1): #falg1 = flag def timer(f): def inner(*args, **kwargs): if flag1: start_time = time.time() time.sleep(0.3) ret = f(*args, **kwargs) end_time = time.time() print('执行效率%s' % (end_time-start_time)) return ret el

python全栈开发从入门到放弃之装饰器函数

1.函数名可以当作函数的参数 1 import time 2 def timmer(func): 3 #函数名可以当做函数的参数 4 def inner(): 5 start = time.time() 6 func() 7 end = time.time() 8 print(end - start) 9 return inner 10 11 def hahaha(): 12 time.sleep(0.1) 13 print('aaaa') 14 15 hahaha() 16 17 输出结果 1

python_如何定义带参数的装饰器?

案例: 实现一个装饰器,用它来检查被装饰函数的参数类型. 需求: 装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常 如何解决这个问题? 先要获取函数的签名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定 把调用函数时候传入的参数和函数签名进行绑定 把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常 #!/usr/bin/python3 from inspect import signature def check_type(*ty_ar

带参数的装饰器

#!/usr/bin/env python # -*- coding:utf-8 -*- # 作者: Apollo # 邮箱: [email protected] # 博客: http://www.zgerji.online/ import time flag = True def timmer_out(f): def timmer(func): def inner(*args, **kwargs): '''执行函数前操作''' if f: start_time = time.time() ti