day14

今日内容:
    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()
"""

 

posted @ 2020-07-22 15:42  板鸭没有腿  阅读(109)  评论(0)    收藏  举报