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).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...
随机推荐
- kuma 学习三 组件说明
当前官方已经提供了两种可选的运行模式 通用模式 kubernetes 模式 kuma 组件说明 kuma-cp kuma 的控制面板 kuma-dp kuma 的数据面板 enovy 提供sideca ...
- Singer 修改tap-s3-csv 支持minio 连接
singer 团队官方处了一个tap-s3-csv 的tap,对于没有使用aws 的人来说并不是很方便了,所以简单修改了 下源码,可以支持通用的s3 csv 文件的处理,同时发布到了官方pip 仓库中 ...
- 一起学Makefile(六)
命令的回显: 通常,make在执行命令之前都会把执行的命令进行输出,例如: 关闭命令回显有以下几种方式: 每个需要关闭回显的命令行之前加上”@”符号: 执行make时机上参数-s 或 –slient进 ...
- 「BJOI2018」治疗之雨
传送门 Description 有\(m+1\)个数,第一个数为\(p\),每轮:选一个数\(+1\),再依次选\(k\)个数\(-1\) 要求如果第一个数\(=N\),不能选它\(+1\),如果第一 ...
- 分析WordPress数据表之分类标签表(功能篇)
数据表分析 wp_terms(分类标签表) 表字段如下:term_id(分类或标签ID)name(分类或标签名)slug(别名)term_group(分类标签组,我想应该是用于排序分组) wp_ter ...
- npm安装插件怎么判断是--save 还是--save--dev
npm敲到一半的时候发现:诶 这个到底是-g呢还是--save还是--save-dev呢 1.首先要先了解package.json 在Node.js中,模块是一个库或框架,也是一个Node.js项目. ...
- 一个按权重(weight)进行LB的算法
package netty; import com.google.common.collect.ImmutableList; import lombok.SneakyThrows; import ja ...
- pandas连接多个表格concat()函数
网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...
- flutter、rn、uni-app比较
前言 每当我们评估新技术时要问的第一个问题就是“它会给我们的业务和客户带来哪些价值?”,工程师们很容易对闪闪发光的新事物着迷,却经常会忽略这些新事物其实可能对我们的客户没有任何好处,反而只会让现有的工 ...
- leetcode 968. Binary Tree Cameras
968. Binary Tree Cameras 思路:如果子节点只能覆盖到父节点.当前节点,但是父节点可以覆盖到他的父节点.子节点.当前节点,所以从叶子节点往上考虑 0代表子节点没有被覆盖 1代表子 ...