• 关于装饰器的一些小练习


    1、编写装饰器,为多个函数加上认证功能(用户账号密码来源于文件)
    要求:登录成功一次,后续的函数都无需再输入用户名和密码
     1 import time
     2 flage = True
     3 def login():#登录认证(三次认证,输错三次等待15秒,再次认证)
     4     j = 0
     5     lis = []
     6     while j < 3:
     7         j += 1
     8         username = input('请输入用户名:
    ').strip()
     9         password = input('请输入密码:
    ')
    10         with open('passwd_note',mode='r',encoding='utf-8') as f:
    11             for i in f:
    12                 lis.append(i.strip())
    13             if lis[0] == username and lis[1] == password:
    14                 print('认证成功!')
    15                 break
    16             elif (3-j) == 0:
    17                 print('账号或密码输入错误请重新输入!您还有{}次机会,请15秒后重新输入!'.format(3-j))
    18                 j = 0
    19                 time.sleep(15)
    20                 continue
    21             else:
    22                 print('账号或密码输入错误请重新输入!您还有{}次机会'.format(3-j))
    23 
    24 
    25 def wrapper_out(flage): #装饰器
    26     def wrapper(func):
    27         def inner(*args,**kwargs):
    28             global flage #修改全局变量申明
    29             if flage:#认证通道
    30                 login()
    31                 ret = func(*args,**kwargs)
    32                 flage = False#修改全局变量,促使后面调用装饰器的函数直接走else,不走if
    33             else:#不认证通道
    34                 ret = func(*args,**kwargs)
    35             return ret
    36         return inner
    37     return wrapper
    38 
    39 @wrapper_out(flage) #
    40 def mx(a,b):
    41     print(max(a,b))
    42 
    43 @wrapper_out(flage) #
    44 def sm(a,b):
    45     print(a+b)
    46 
    47 #调用
    48 mx(1,2)
    49 sm(2,3)
    2、编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
     1 flage = True
     2 def wrapper_out(flage): #装饰器
     4     def wrapper_func(func):
     5         def inner(*args,**kwargs):
     6             if flage:
     7                 ret = func(*args,**kwargs)
     8             else:
     9                 ret = func(*args,**kwargs)
    10             with open('log','a',encoding='utf-8') as f1:
    11                 f1.write('{}
    '.format(func.__name__)) #将调用函数的函数名的函数名写入文件
    12             return ret
    13         return inner
    14     return wrapper_func
    15 
    16 @wrapper_out(flage) #记录调用函数名的装饰器调用
    17 def mx(a,b):
    18     print(max(a,b))
    19 
    20 @wrapper_out(flage)
    21 def sm(a,b):
    22     print(a+b)
    23 
    24 #调用
    25 mx(1,2)
    26 sm(2,3)
  • 相关阅读:
    基于AOP实现Ibatis的缓存配置过期策略
    Step by Step构建自己的ORM系列配置管理层
    云计算从基础到应用架构系列云计算的演进
    设计模式系列桥接模式
    云计算从基础到应用架构系列云计算的概念
    云计算从基础到应用架构系列虚拟化的技术(上)
    设计模式系列装饰模式
    typeof和GetType区别
    白话学习MVC(四)URL路由
    五、DirectX编程
  • 原文地址:https://www.cnblogs.com/kindvampire/p/10310796.html
Copyright © 2020-2023  润新知