day15

装饰器的进阶

有参装饰器

@auth(chose) 相等于以下两行代码的解构

wrapper = auth(chose)

foo = wrapper(foo)

# dic = {'username': None,
# 'flag': False
# }
#
# def auth(argv):
# def wrapper(f):
# def inner(*args, **kwargs):
# if dic['flag']:
# f(*args, **kwargs)
# else:
# if argv == "QQ":
# print('欢迎来到QQ')
# user = input("username:")
# pwd = input("password:")
# if user == 'alex' and pwd == 'alex123':
# dic['flag'] = True
# dic['username'] = user
# f(*args, **kwargs)
# else:
# print('用户名或者密码错误!')
# elif argv == '微信':
# print('欢迎来到微信')
# user = input("username:")
# pwd = input("password:")
# if user == 'alex' and pwd == 'alex123':
# dic['flag'] = True
# dic['username'] = user
# f(*args, **kwargs)
# else:
# print('用户名或者密码错误!')
# elif argv == '抖音':
# print('欢迎来到抖音')
# user = input("username:")
# pwd = input("password:")
# if user == 'alex' and pwd == 'alex123':
# dic['flag'] = True
# dic['username'] = user
# f(*args, **kwargs)
# else:
# print('用户名或者密码错误!')
# else:
# print('欢迎来到邮箱')
# user = input("username:")
# pwd = input("password:")
# if user == 'alex' and pwd == 'alex123':
# dic['flag'] = True
# dic['username'] = user
# f(*args, **kwargs)
# else:
# print('用户名或者密码错误!')
# return inner
# return wrapper
# msg = """
# QQ
# 微信
# 抖音
# 邮箱
# 请输入您要选择登陆的app:
# """
# chose = input(msg)
# @auth(chose.upper())
# def func():
# print(f'{chose}欢迎你')
# func() # @auth(chose) 相等于以下两行代码的解构
# wrapper = auth(chose)
# foo = wrapper(foo)
多个装饰器装饰一个函数

被装饰的函数正上方多个装饰器,先执行离被装饰函数最近的装饰器

def wrapper1(f):
def inner1():
print(1)
f()
print(2)
return inner1 def wrapper2(f):
def inner2():
print(2)
f()
print(3)
return inner2 def wrapper3(f):
def inner3():
print(3)
f()
print(4)
return inner3 @wrapper1
@wrapper2
@wrapper3
def foo():
print(222)
foo()
# 1 2 3 222 4 3 2
# foo = wrapper3(foo) # foo == inner3
# foo = wrapper2(foo) # inner2 = wrapper2(inner3)
# foo = wrapper1(foo) # inner1 = wrapper1(inner2)
# foo() #inner1 def wrapper1(f):
def inner1():
print(1)
f()
print(2)
return inner1 def wrapper2(f):
def inner2():
print(2)
f()
print(3)
return inner2 def wrapper3(f):
def inner3():
print(3)
f()
print(4)
return inner3 @wrapper1
@wrapper3
@wrapper2
def foo():
print(222)
foo()
# 1 3 2 222 3 4 2
# foo = wrapper2(foo) # foo == inner2
# foo = wrapper3(foo) # inner3 = wrapper3(inner2)
# foo = wrapper1(foo) # inner1 = wrapper1(inner3)
# foo() #inner1

day15——有参装饰器、多个装饰器装饰一个函数的更多相关文章

  1. Python:有参装饰器与多个装饰器装饰一个函数

    有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...

  2. python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题

    1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...

  3. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

  4. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  5. python27期day13:闭包、装饰器初始、标准版装饰器、作业题

    1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...

  6. 使用@contextmanager装饰器实现上下文管理器

    通常来说,实现上下文管理器,需要编写一个带有__enter__和 __exit__的类,类似这样: class ListTransaction: def __init__(self, orig_lis ...

  7. Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

    函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...

  8. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  9. python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结

    1.上周回顾 1).函数名的应用 直接打印函数名,是函数的地址 变量 函数的参数 函数的返回值 可以当容器类数据类型的元素 2).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...

随机推荐

  1. Numpy | 12 数组操作

    Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 一.修改数组形状 函数 描述 reshape 不改变数据 ...

  2. 使用openrc 管理容器中的服务

    对于后台任务一般是不建议在容器中运行的,但是如果我们为了简化应用的部署,可能会使用后台任务进行服务的管理,类似的 工具很多,supervisor,systemd , init.d 同时对于docker ...

  3. 腾讯蓝鲸cmdb部署

    蓝鲸配置平台 (CMDB)http://172.16.6.10:8088 环境(单机测试): Centos6 16G 200G 依赖环境: Java 1.8.0_92 python 2.7 ZooKe ...

  4. Java-JUC(十五):synchronized执行流程分析

    一.锁对象及 synchronized 的使用 synchronized 通过互斥锁(Mutex Lock)来实现,同一时刻,只有获得锁的线程才可以执行锁内的代码. 锁对象分为两种: 实例对象(一个类 ...

  5. java命名总结

    下文主要来源于网上,我做了一些编辑整理. “如果你不知道一件事物叫什么, 你就不知道它是什么. 如果你不知道这是什么, 你就不可能坐下来写代码.” ----萨姆·加德纳(Sam Gardiner) 1 ...

  6. ps 渐进式图片的技巧(支持jpg,gif,png)

    https://www.zhangxinxu.com/wordpress/2013/01/progressive-jpeg-image-and-so-on/ CTRL + SHIFT + ALT + ...

  7. Mybatis报错:org.apache.ibatis.builder.IncompleteElementException

    org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.lang.Integer遇到这 ...

  8. IfcAxis2Placement3D

    The IfcAxis2Placement3D provides location and orientations to place items in a three-dimensional spa ...

  9. MySQL慢查询参数

    开启mysql慢查询日志 修改/etc/mysql/my.cnf配置文件,添加: [mysqld]slow_query_log = onslow_query_log_file = /var/lib/m ...

  10. aps.net StateServer设置

    1.在 system.web节点 加 <sessionState mode="StateServer" stateConnectionString="tcpip=1 ...