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).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...
随机推荐
- Hibernate的批量查询——Criteria查询所有、条件、分页、统计(聚合函数)、排序
1.查询所有的学生信息: public static void testSel() { Session session = HibernateUtils.openSession(); Transact ...
- JS的ES6的Promise
一.Promise 1.什么是Promise对象:代表未来某个将要发生的事件,一般指的是异步操作. 2.Promise对象 存在的目的:将异步操作以同步的流程表达出来,避免层层嵌套的回调函数(俗称回调 ...
- 16-网页,网站,微信公众号基础入门(网页版MQTT,页面控件位置调整入门)
https://www.cnblogs.com/yangfengwu/p/11200767.html 说一下,只要你java学的很好,那么几乎所有的语言都不在话下了 来看一下样式设置 运行 在左上角感 ...
- SQL基础-存储过程&触发器
一.存储过程 1.存储过程简介 存储过程: 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 存储过程的创建: ...
- Ubuntu 19.04 安装docker
配置国内源: deb https://mirrors.ustc.edu.cn/ubuntu/ disco main restricted universe multiverse deb https:/ ...
- oracle 使用count()函数进行分组计数时所踩的坑!
1.情景展示 需要对id_card字段按字符长度进行分组统计并进行计数. 2.错误方式 第一步:统计出id_card字段共存在几种情况. 第一种方式:distinct 第二种方式:group by ...
- [技术博客]使用CDN加快网站访问速度
[技术博客]使用CDN加快网站访问速度 2s : most users are willing to wait 10s : the limit for keeping the user's atten ...
- srs安装与ffmpeg推流
环境说明:ubuntu 16.04 当前目录为~/. 一. 下载 git clone https://github.com/ossrs/srs.git 二.部署SRS 关闭防火墙,执行如下命令. uf ...
- java join()基本用法与说明解释
join()方法的作用,是等待这个线程结束: 也就是说,t.join()方法阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续: ...
- Python示例项目学习
原文地址:http://www.360doc.com/showweb/0/0/874025604.aspx 「 Python3 实现火车票查询工具 」 相信很多人学Python都是冲着它强大的爬虫 ...