day15——有参装饰器、多个装饰器装饰一个函数
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——有参装饰器、多个装饰器装饰一个函数的更多相关文章
- Python:有参装饰器与多个装饰器装饰一个函数
有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...
- python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题
1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...
- python 装饰器的理解以及类装饰器
python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...
- python27期day13:闭包、装饰器初始、标准版装饰器、作业题
1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...
- 使用@contextmanager装饰器实现上下文管理器
通常来说,实现上下文管理器,需要编写一个带有__enter__和 __exit__的类,类似这样: class ListTransaction: def __init__(self, orig_lis ...
- Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数
函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...
- python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)
函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...
- python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结
1.上周回顾 1).函数名的应用 直接打印函数名,是函数的地址 变量 函数的参数 函数的返回值 可以当容器类数据类型的元素 2).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...
随机推荐
- JS的ES6的基础语法
JS的ES6 1.let let age = 12; (1). 作用: 与var类似, 用于声明一个变量 (2). 特点: 在块作用域内有效 不能重复声明 不会预处理, 不存在提升 (3). 应用: ...
- javascript冒泡排序 至少比较N(N-1)/2次;
<script type="text/javascript"> function get(){ var num = [10,5,2,1,3,6,4,7,9,8]; va ...
- %lld 和 %I64d
在Linux下输出long long 类型的是 printf("%lld", a); 在Windows下输出是 printf("%I64d", a); xxy学 ...
- 因子分解机 FM
特征组合 人工方式的特征工程,通常有两个问题: 特征爆炸 大量重要的特征组合都隐藏在数据中,无法被专家识别和设计 针对上述两个问题,广度模型和深度模型提供了不同的解决思路. 广度模型包括FM/FFM等 ...
- K8s configMap原理介绍
给容器内应用程序传递参数的实现方式: 1. 将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活. 2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:[" ...
- linux 运维基本操作
本记录来自腾讯云实验 https://cloud.tencent.com/developer/labs/lab/10000 目录操作 任务时间:5min ~ 10min 创建目录 使用 mkdir ...
- yum本地安装rrdtool报错,提示版本冲突的解决办法
[root@mysql-mon40 mm]# yum localinstall rrdtool-1.4.7-1.el6.rfx.x86_64.rpm -y 错误: Multilib version p ...
- [原创]敏捷管理实践Scrum思维导图
[原创]敏捷管理实践Scrum思维导图
- dubbo中的Filter链原理及应用
转载:https://www.jianshu.com/p/f390bb88574d filter在dubbo中的应用非常广泛,它可以对服务端.消费端的调用过程进行拦截,从而对dubbo进行功能上的扩展 ...
- Composer教程
介绍 PHP程序的包管理器 负责, 配置需要的项目, 项目需要的项目. 解决, 项目的依赖问题. 当前的PHP项目, 当作一个软件包去看待. 思路: 将软件集中在统一的软件源中. 安装 ...