zoukankan      html  css  js  c++  java
  • python 装饰器

    #############################总结#########################################

    函数名的应用:

        1,直接打印函数名得到的是函数的内存地址。

        2,函数名可以赋值运算

        3,函数名可以作为函数的参数

        4,函数名可以当做函数的返回值

    装饰器:

    python 里面的动态代理

    存在的意义:在不破坏原有函数的基础上,给函数添加新的功能

    def wrapper(fn):
    def inner(*args,**kwargs): #为目标函数传参
    '''在执行目标之前'''
    ret=fn(*args,**kwargs)#调用目标函数,ret是目标函数的返回值
    '''在执行目标之后'''
    return ret #把目标函数返回值返回,保证函数正常的结束
    return inner
    @wrapper #target_fun=wrapper(target_func)
    def target_func():
    pass
    target_func()
    注意:return用法 
    1.函数遇到return时函数体结束
    2.如果return后面跟上函数名则返回函数名在内存中的id
    3.如果return后面跟上其他字符则返回其本身
    ###########################################################################
    def wrapper(fn):
    def inner(*args, **kwargs):
    print("准备点钱")
    ret = fn(*args, **kwargs)#这里不ret接收 得不到函数的返回值
    return ret
    return inner
    #
    @wrapper
    def yue(tools):
    print("使用%s约一约" % tools)
    return "chengle"


    ret = yue('momo')
    print(ret)

    准备点钱
    使用momo约一约
    chengle

    login_name = ""
    flag = False
    
    def login_verify(fn):
        def inner(*args, **kwargs):#可以理解成函数的形参
            while 1:
                if flag == True:
                    ret = fn(*args, **kwargs)#可以理解成函数的实参
                    return ret
                else:
                    print("您还没有登录. 请登录!")
                    login()
        return inner
    
    def login():
        print("=============欢迎进入登录环节================")
        while 1:
            uname = input('请输入你的用户名:')
            upwd = input('请输入你的密码:')
    
            f = open('register', mode="r", encoding="utf-8")
            for line in f:
                d = eval(line.strip())
                if uname == d['username'] and upwd == d["password"]:
                    global login_name
                    global flag
                    login_name = uname # 保存登录的用户名
                    flag = True
                    print("=============登录成功!!!!!================")
                    f.close()
                    return
            else:
                f.close() # 关文件
                y = input("=============用户名或密码错误,是否重新登录(Y/N)!!!!!================")
                if y.upper() != "Y":
                    return

    @login_verify
      def article():

      pass

     

     #################################作业题##################################

    2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码

    def func1(f):
    def inner():
    print('每次执行前都经过这里')
    retun inner
    @func1
    def func2():
    print('hello world')
    func2()

    4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.

    def func2(f):
    def innter():
    a=1
    while a<=3:
    username=input('请输入用户名:')
    password=input('请输入密码')
    if username=='alex' and password=='123456':
    f()
    break
    else:
    print('账号错误,还剩下%s次机会' %(3-a))
    a+=1
    continue
    return innter
    @func2
    def func1():
    print('登陆成功')
    func1()

    5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
      要求登录成功一次,后续的函数都无需再输入用户名和密码

    dic = {
        'name':None,
        'status' : False
    }
    
    def func1(f):
        def inner(*args,**kwargs):
            num = 0
            while num < 3:
                if dic['status']:
                    ret = f(*args,**kwargs)
                    return ret
                else:
                    username = input('请输入用户名')
                    password = input('请输入密码')
                    f1 = open('test.txt',encoding='utf-8')
                    for i in f1:
                        new_list = i.strip().split()
                        if username == new_list[0] and password == new_list[1]:
                            dic['status'] = True
                            break
                    else:
                        num += 1
                        print('输入用户名或密码错误还有{}次机会'.format(3-num))
                        continue
        return inner
    
    
    @func1# func4=func1(func4)
    def func4():
        print('登录成功')
    
    func4()

    6,给每个函数写一个记录日志的功能,
    功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
    所需模块:
    import time
    struct_time = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

    import time
    def wapper(f):
        def inner(*args,**kwargs):
            struct_time = time.localtime()
            time_log = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
            f1 = open('log1.txt',encoding='utf-8',mode='a')
            f1.write(time_log+'	')
            f1.write(str(f)+'
    ')
            f(*args,**kwargs)
        return inner
    
    @wapper
    def func1(*args,**kwargs):
        print('hello world')
    
    
    func1('aa','bbb')
    import time
    
    def logger(fn):
        def inner(*args, **kwargs):
            # fn.__name__ # 函数名字
            f = open("log", mode="a", encoding="utf-8")
            f.write("在%s, 访问了%s函数
    " % (time.strftime("%Y-%m-%d %H:%M:%S"), fn.__name__))
            ret = fn(*args, **kwargs)
            return ret
        return inner
    
    
    @logger
    def chi():
        print("wusir特别能吃")
    @logger
    def he():
        print("太白特别能和")
    @logger
    def shui():
        print("太黑特别能睡")
    
    chi()
    chi()
    he()
    chi()
    shui()
    shui()
    不怕大牛比自己牛,就怕大牛比自己更努力
  • 相关阅读:
    技术列表
    常用软件开发工具
    EXCEL数据导入SQL2008相关操作
    点点滴滴
    揪出ASP.NET 2.0四大“插件”的总后台 ASPNETDB
    古人说
    好点子都是偷来的:史上最感性的60堂创新课读书摘要
    我是怎么割韭菜的:一个骗子的悔过与自白读书摘要
    人生如我读书摘要
    德米安:彷徨少年时读书摘要
  • 原文地址:https://www.cnblogs.com/zaizai1573/p/10121431.html
Copyright © 2011-2022 走看看