'''
1、整理装饰器的形成过程,背诵装饰器的固定格式
'''
'''开放封闭原则:为了保证程序的稳定性,和功能的可开放性,在不修改目标函数源代码和调用方式的情况下,对目标函数增加新功能'''
# def wrapper(func): #1.装饰器函数 3.调用装饰器函数
# def inner(*args, **kwargs): #4.内部函数(动态位置形参,动态关键字形参) 7.调用装饰器内部函数
# print("调用被装饰函数前的操作.") #8.调用被装饰函数前增加的代码块
# ret = func(*args, **kwargs) #9.调用被装饰函数(不定位置实参,不定关键字实参)
# print("调用被装饰函数后的操作.") #13.调用被装饰函数后增加的代码块
# return ret #14.被装饰函数的返回值
# return inner #5.返回装饰器内部函数名
#
# @wrapper # 2.调用装饰器函数,这里等同于 fn = wrapper(fn) 语法糖 10.调用被装饰函数
# def func(): #被装饰函数(动态位置参数,动态关键字参数)
# print("func is running...") #11.执行被装饰函数体
#
# func() #6.调用被装饰函数 '''
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需
求添加代码’
'''
# def wrapper(func): #装饰器函数
# def inner(*args, **kwargs): #装饰器内部函数
# print("每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码")
# return func(*args, **kwargs) #调用被装饰函数
# return inner #返回装饰器函数内部函数名
#
# @wrapper # 这里等同于fn = wrapper(fn)
# def func(): #被装饰函数
# print("func is running...")
#
# func() #调用函数 '''
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据
需求添加代码’
'''
# def wrapper(func): #装饰器函数
# def inner(*args, **kwargs): #装饰器内部函数
# ret = func(*args, **kwargs) #调用被装饰函数
# print("每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码")
# return ret #返回被装饰函数的返回值
# return inner #返回装饰器函数内部函数名
#
# @wrapper # 这里等同于fn = wrapper(fn)
# def func(): #被装饰函数
# print("func is running...")
#
# func() '''
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访
问该函数.
'''
# def user_auth(func): #装饰器函数
# def inner(*args, **kwargs): #装饰器内部函数
# for i in range(3, 0, -1):
# while 1:
# print("\033[31;0m请先登录\033[0m".center(50, "*"))
# name = input("Username: ").strip()
# if name == "":
# print("\033[31;0m用户名不能为空.\033[0m")
# continue
# pwd = input("Password: ").strip()
# if pwd == "":
# print("\033[31;0m密码不能为空.\033[0m")
# continue
# if name == userinfo_dic["username"] and pwd == userinfo_dic["pwd"]: #认证通过
# print("\033[32;0m登录成功.\033[0m")
# return func(*args, **kwargs) #调用目标函数
# else: #认证失败
# if i == 1:
# exit("\033[31;0m用户名或密码错误.程序自动退出.\033[0m")
# else:
# print("\033[31;0m用户名或密码错误.您还有%s次机会哦.\033[0m" % (i-1))
# break
#
# return inner #返回装饰器函数内部函数名
#
# @user_auth # 这里等同于fn = wrapper(fn)
# def func(): #目标函数
# print("func is running...")
#
# userinfo_dic = {"username": "alex", "pwd":"123456"} #保存用户名和密码
# func() '''
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用
户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
'''
# def user_auth(func): #装饰器函数
# def inner(*args, **kwargs): #装饰器内部函数
# global auth_flag
# if auth_flag: #已登录
# return func(*args, **kwargs) # 调用目标函数
#
# for i in range(3, 0, -1): #三次认证机会
# while 1:
# print("\033[31;0m请输入正确的用户名和密码\033[0m".center(50, "*"))
# name = input("Username: ").strip()
# if name == "":
# print("\033[31;0m用户名不能为空.\033[0m")
# continue
# pwd = input("Password: ").strip()
# if pwd == "": #用户名和密码不能为空
# print("\033[31;0m密码不能为空.\033[0m")
# continue
# user_dic = {}
# with open(filename, mode="r", encoding="utf-8") as f: #读文件userinfo.txt
# user_dic = eval(f.read().strip()) #获取文件的内容,转化为字典类型
#
# if name == user_dic["username"] and pwd == user_dic["pwd"]: #认证通过
# auth_flag = 1
# print("\033[32;0m登录成功.\033[0m")
# return func() # 调用目标函数
# else: #认证失败
# if i == 1:
# exit("\033[31;0m用户名或密码错误.程序自动退出.\033[0m")
# else:
# print("\033[31;0m用户名或密码错误.您还有%s次机会哦.\033[0m" % (i-1))
# break
# return inner #返回装饰器函数内部函数名
#
# @user_auth #这里等同于fn1 = wrapper(fn1)
# def func1():
# print("func1 is running...")
#
# @user_auth #这里等同于fn2 = wrapper(fn2)
# def func2():
# print("func2 is running...") # auth_flag = 0 #用户登录标记 0未登录,1已登录
# filename = "userinfo.txt"
# func1()
# func2() '''
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登
录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
'''
# def user_auth(func): #装饰器函数
# def inner(*args, **kwargs): #装饰器内部函数
# global login_flag
# if login_flag: #用户已登录
# return func(*args, **kwargs) # 调用目标函数
#
# user_dic = {}
# with open(filename, mode="r", encoding="utf-8") as f: #获取用户文件内容,转换为字典
# user_dic = eval(f.read().strip())
# for i in range(3, 0, -1): #三次机会
# while 1:
# print("\033[31;0m请先登录\033[0m".center(50, "*"))
# name = input("Login Username: ").strip()
# if name == "":
# print("\033[31;0m用户名不能为空.\033[0m")
# continue
# pwd = input("Login Password: ").strip()
# if pwd == "":
# print("\033[31;0m密码不能为空.\033[0m")
# continue
# if name in user_dic:
# if user_dic[name]["pwd"] == pwd: #认证通过
# login_flag = 1
# print("\033[32;0m登录成功.\033[0m")
# return func(*args, **kwargs) # 调用目标函数
# if i == 1: #认证失败
# exit("\033[31;0m用户名或密码错误.程序自动退出.\033[0m")
# else:
# print("\033[31;0m用户名或密码错误.您还有%s次机会哦.\033[0m" % (i-1))
# break
# return inner #返回装饰器函数内部函数名
#
# @user_auth # 这里等同于fn1 = wrapper(fn1)
# def func1():
# print("func1 is running...")
#
# @user_auth #这里等同于fn2 = wrapper(fn2)
# def func2():
# print("func2 is running...")
#
# filename = "userinfo-more.txt"
# login_flag = 0
# func1()
# func2() '''
7、给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
'''
# import time
#
# def write_log(func): #装饰器函数,也是一个闭包函数
# def inner(*args, **kwargs): #装饰器内部函数
# with open("log", mode="a", encoding="utf-8") as f: #追加写文件
# f.write("%s\t%s\n" % (func.__name__, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
# return func(*args, **kwargs) #调用目标函数
# return inner #返回装饰器函数的内部函数
#
# @write_log #调用装饰器函数,等同于 func1 = write_log(func1)
# def func1():
# print("func1 is running...")
#
# @write_log #调用装饰器函数,等同于 func1 = write_log(func1)
# def func2():
# print("func2 is running...")
#
# func1()
# func2()

python3 练习题 day04的更多相关文章

  1. Python3练习题系列(09)——物以类聚,人以群分

    目标: 用类管理同类事物 解析: 用到“class”的编程语言被称作“Object Oriented Programming(面向对象编程)”语言.首先你需要做出“东西”来,然后你“告诉”这些东西去完 ...

  2. 【Python3练习题 025】 一个数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同

    [Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同 x = input('请输入任意位数的数字:') if x == x[::-1]: ...

  3. 【Python3练习题 009】 打印出所有的“水仙花数”

    # [Python练习题 009] 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,# 其各位数字立方和等于该数本身.例如:153是一个“水仙花数”,# 因为153=1的三次方+5的三次方+ ...

  4. # 【Python3练习题 004】输入某年某月某日,判断这一天是这一年的第几天?

    # [Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? # 思路:先判断是否为闰年,这关系到 2 月份的天数.# 之后再根据月份值把前几个月的天数累积加起来,最后再加上个“日 ...

  5. 【Python3练习题 002】企业发放的奖金根据利润提成

    # [Python练习题 002]企业发放的奖金根据利润提成.# 利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分, ...

  6. Python3练习题 001:4个数字求不重复的3位数

    #Python练习题 001:4个数字求不重复的3位数#方法一import itertoolsres = [][res.append(i[0]*100 + i[1]*10 + i[2]) for i ...

  7. python3 练习题 day01

    #练习题:'''1.简述变量命名规范'''#变量名由数字.字母.下划线组成#变量名可以字母和下划线开头,不能以数字开头,并且不能全为数字#变量名不能太长,且要有意义#最好使用驼峰或下划线格式命令#变量 ...

  8. Python3练习题系列(10)——项目骨架构建

    目标: 如何创建<项目“骨架”目录> 包含:项目文件布局.自动化测试代码,模组,以及安装脚本. 由于编写一个Python文件可以作为一个模块,一个带__init__.py的目录算一个包. ...

  9. Python3练习题系列(06)——各种符号总结

    Python3中的各种符号总结 1关键字 import keyword print(keyword.kwlist, end='\t') ['False', 'None', 'True', 'and', ...

随机推荐

  1. es6 语法 (Generator)

    { // 长轮询 let ajax=function* (){ yield new Promise(function(resolve,reject){ setTimeout(function () { ...

  2. Glide图片加载框架小bug

    如上一段加载图片的代码,本身是没问题的,后来测试发现有情况不显示url对应的图片,而一直显示加载超时的图片 修改如下: 将with()方法的上下文context改为图片的imageView.getCo ...

  3. <1>Linux日志查找方法

    Linux日志查找方法 适用于测试,开发,运维人员,用来查找Linux服务器问题的一般方法,比较实用,如果有更好的办法可以一块讨论,欢迎大神们来指导哈!!! 进入正题 第一步.通过Xshell登录服务 ...

  4. springboot 学习之路 2(注解介绍)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  5. (后台)SQL Server 数据库定时自动备份(转)

    转自博客园: SQL Server 数据库定时自动备份[转]   在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以 ...

  6. float、double、BigDecimal的一些精度问题

    float f = 280.8f;System.out.println(f*100);结果是什么?结果是:28080.0f(我是这么想的)实际结果是:28079.998 既然float处理有问题换do ...

  7. ASP.NET Core 应用发布与部署指南

    一.前言 本篇主要包含哪些内容? 将项目发布到本地目录 将项目传输到服务器并配置启动&开机自动启动 将Nginx作为访问入口,配置反向代理 本篇环境信息 开发环境: 用途 工具&版本 ...

  8. AIOps 平台的误解,挑战及建议(下)— AIOps 挑战及建议

    本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...

  9. MySQL 博客文章目录(2017-02-18更新)

    1MySQL安装配置 Linux MySQL源码安装缺少ncurses-devel包 Linux平台卸载MySQL总结 Linux 卸载mysql-libs包出现错误 CentOS 7 安装MySQL ...

  10. mysql 最左匹配 联合索引

    mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引:如果有一个3列索引(col1 ...