今日内容:
1、闭包函数=函数嵌套定义+函数对象+名称空间与作用域
2、装饰器
无参
有参
# 闭包函数
"""
# 闭包函数 = 函数嵌套定义+函数对象+名称空间与作用域
# 闭包函数
# 1、闭:指的是该函数是定义在一个函数内部的函数
# 2、包:指的是该函数访问了一个来自于外层函数的变量
# 为函数体传参:
# 方案一:直接使用参数的形式传递
# def wrapper(x):
# print(x)
#
# wrapper(111)
# wrapper(222)
# 方案二:把函数体想要的参数包给它
# def outter(x):
# # x = 111
#
# def wrapper(): # wrapper = 闭包函数的内存地址
# print(x)
#
# return wrapper # 一定不要加括号
# # return 闭包函数的内存地址
#
# f1 = outter(111) # f = 闭包函数的内存地址
# f2 = outter(222) # f = 闭包函数的内存地址
"""
# 装饰器
"""
1、什么是装饰器
器:工具
装饰:为被装饰者添加额外的功能
2、为何要有装饰器
软件一旦上线运行之后,就应该遵循开放封闭原则:
1、开放指的是对拓展新功能开放
2、封闭指的是对修改源代码封闭
定义装饰器的目的:
定义装饰器就是为了在遵循1和2的前提下来为其他函数添加新功能的
ps:不修改被装饰对象指的是定义与调用都不能修改
3、如何用装饰器
# 一、被装饰器对象index如下:
# import time
#
# def index(x,y):
# time.sleep(1)
# print('index===>',x,y)
#
# index(1,2)
# 二、为index添加新功能
# import time
# from functools import wraps
#
# def timmer(func):
# # func = index
# @wraps(func)
# def wrapper(*args,**kwargs):
# start_time = time.time()
# res=func(*args,**kwargs)
# stop_time = time.time()
# print('run time is: %s' %(stop_time - start_time))
# return res
# return wrapper
#
# @timmer # index=timmer(index)
# def index(x,y):
# time.sleep(1)
# print('index===>',x,y)
#
# @timmer # home=timmer(home)
# def home(name):
# "home的文档注释"
# time.sleep(0.5)
# print('welcome %s to home page' %name)
# return 123
# res=index(1,2)
# res=home('egon')
# ===========================无参装饰器的模板===========================
# def outter(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper
# 2、叠加多个装饰器
# 2.1 加载顺序:自下而上
# 2.2 执行顺序:自上而下
# def deco1(func1): # func1 = wrapper2的内存地址
# def wrapper1(*args,**kwargs):
# print('wrapper1====>')
# res1=func1(*args,**kwargs)
# return res1
# return wrapper1
#
# def deco2(func2): # func2 = wrapper3的内存地址
# def wrapper2(*args,**kwargs):
# print('wrapper2====>')
# res2=func2(*args,**kwargs)
# return res2
# return wrapper2
#
# def deco3(func3): # func3 = 最原始的那个被装饰函数的内存地址
# def wrapper3(*args,**kwargs):
# print('wrapper3====>')
# res3=func3(*args,**kwargs)
# return res3
# return wrapper3
# # index=wrapper1的内存地址
# @deco1 # deco1(wrapper2的内存地址)=>wrapper1的内存地址
# @deco2 # deco2(wrapper3的内存地址)=>wrapper2的内存地址
# @deco3 # deco3(最原始的那个被装饰函数的内存地址)=>wrapper3的内存地址
# def index(x,y):
# print('index=>',x,y)
#
# index(1,2)
#
# (输出)
## wrapper1====>
## wrapper2====>
## wrapper3====>
## index=>1,2
#
#3 案例
# import time
#
# def deco1(func1):
# def wrapper1(*args,**kwargs):
# start_time = time.time()
# res1=func1(*args,**kwargs)
# stop_time = time.time()
# print(stop_time - start_time)
# return res1
# return wrapper1
#
#
# def deco2(func2):
# def wrapper2(*args,**kwargs):
# inp_name = input('username>>>: ').strip()
# inp_pwd = input('password>>>: ').strip()
# if inp_name == "egon" and inp_pwd == "123":
# print('login successful')
# res2=func2(*args,**kwargs)
# return res2
# else:
# print('username or password error')
# return wrapper2
#
# @deco2
# @deco1
# def index(x,y):
# time.sleep(1)
# print('index=>',x,y)
#
# index(1,2)
# 有参装饰器
# def outter(engine = 'file'):
# def deco2(func2):
# def wrapper2(*args,**kwargs):
# inp_name = input('username>>>: ').strip()
# inp_pwd = input('password>>>: ').strip()
#
# if engine == "file":
# print('基于file的认证')
# if inp_name == "egon" and inp_pwd == "123":
# print('login successful')
# res2=func2(*args,**kwargs)
# return res2
# else:
# print('username or password error')
# elif engine == 'mysql':
# print('基于mysql的认证')
# elif engine == 'ldap':
# print('基于ldap的认证')
# else:
# print('未知的engine')
# return wrapper2
# return deco2
#
# @outter(engine='mysql') # @deco2 # index=deco2(index)
# def index(x,y):
# print('index=>',x,y)
#
# index(1,2) # index=>wrapper
# 有参装饰器的模板:
# def outter2(x,y,z,a,b):
# def outter1(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper
# return outter1
"""
# 作业
"""
# 无参装饰器的模板
# def outter(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper
# 一:编写函数,(函数执行时间用time.sleep(n)代表)
# import time
# def timer():
# time.sleep(1)
# print('time->1')
# timer()
# 二:编写装饰器,为函数加上统计时间的功能
# import time
# def timer(func):
# def wrapper(*args,**kwargs):
# start_time = time.time()
# res=func(*args,**kwargs)
# stop_time = time.time()
# print('时间:%s'%(stop_time - start_time))
# return res
# return wrapper
#
# @timer
# def timer():
# time.sleep(1)
# print('time->1')
# timer()
# 三:编写装饰器,为函数加上认证的功能
# import time
# def auth(func):
# def wrapper(*args,**kwargs):
#
# username = input('username>>>:')
# password = input('password>>>:')
# if username == 'shang' and password == '9999':
# print('login successful')
# res = func(*args, **kwargs)
# return res
# else:
# print('error')
#
# return wrapper
# @auth
# def timer():
# time.sleep(1)
# print('time->1s')
# timer()
# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
# login_name = None
#
#
# def login(func):
# def wrapper(*args, **kwargs):
# global login_name
# d = {}
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# with open(r'F:\notepad\2020.7.01\day11\users.txt', mode='rt') as f:
# for line in f:
# name, pwd = line.strip().split(':')
# d[name] = pwd
# if username in d.keys() and pwd == d[username]:
# print('login successful')
# login_name = username
# res = func(*args, **kwargs)
# return res
# else:
# print('error')
# return wrapper
# @login
# def login1():
# print('666')
#
#
# login1()
"""