python之装饰器的进阶
一、带参数的装饰器 (必须会)
针对不同的app的验证,比如:天猫和天猫超市,京东商城和京东超市
def wrapper_out(n):
print(n)
def wrapper(f):
def inner(*args,**kwargs):
if n == '腾讯':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('qq.txt',mode='r+',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
return False
elif n == '抖音':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('dy.txt',mode='r+',encoding='utf-8') as f2:
for j in f2:
username, password = j.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args, **kwargs)
return ret
return False
return inner
return wrapper
@wrapper_out('腾讯')
def qq():
print('成功访问qq')
qq()
@wrapper_out('抖音')
def tiktok():
print('成功访问抖音')
tiktok()
函数一般嵌套3层
def wrapper_out(n):
def wrapper(f):
def inner(*args,**kwargs):
with open(n,encoding = 'utf-8') as f1:
for line in f1:
user,pass = line.strip().split('|')
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
if username == user and passwor == pass:
dic_status['status'] = True
ret = f(*args,**kwargs)
return ret
看到带参数的装饰器分两步执行:
1.执行warpper_out('腾讯')这个函数,把相应的参数'腾讯'传给n,并且得到返回值warpper
2.与@warpper结合,得到我们之前熟悉的标准版的装饰器按照装饰器流程执行
练习题
# 如果输入的是抖音的账号和密码就访问抖音,如果输入的是腾讯的用户名和密码就访问腾讯
def wrapper_out(n):
print(n)
def wrapper(f):
def inner(*args,**kwargs):
if n == '腾讯':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('qq.txt',mode='r+',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
return False
elif n == '抖音':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('dy.txt',mode='r+',encoding='utf-8') as f2:
for j in f2:
username, password = j.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args, **kwargs)
return ret
return False
return inner
return wrapper
@wrapper_out('腾讯')
def qq():
print('成功访问qq')
qq()
@wrapper_out('抖音')
def tiktok():
print('成功访问抖音')
tiktok()
增强耦合性写法
def wrapper_out(n):
def wrapper(f):
def inner(*args,**kwargs):
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open(n,mode='r',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
else:
print('验证失败')
return False
return inner
return wrapper
@wrapper_out('qq')
def qq():
print('成功访问qq')
qq()
@wrapper_out('dy')
def tiktok():
print('成功访问抖音')
tiktok()
二、多个装饰器装饰一个函数 (流程会)
def wrapper1(func1): # func1 = f原函数
def inner1():
print('wrapper1 ,before func') # 2
func1()
print('wrapper1 ,after func') # 4
return inner1
def wrapper2(func2): # func2 == inner1
def inner2():
print('wrapper2 ,before func') # 1
func2() # inner1
print('wrapper2 ,after func') # 5
return inner2
@wrapper2 # f = wrapper2(f) 里面的f == inner1 外面的f == inner2
@wrapper1 # f = wrapper1(f) 里面的f == func1 外面的 f == inner1
def f():
print('in f') # 3
f() # inner2()
# 输出结果
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
三、递归函数 (练习题,作业题会做*)
递归就是自己用自己
官网规定: 默认递归的最大深度1000次
如果你递归超过100次还没有解决这个问题,那么执意使用递归,效率很低
形式
def func(n):
print(n)
n += 1
func(n)
func(1)
练习题
# 查看电脑执行次数
import sys
print(sys.setrecursionlimit(1000000))
def func(n):
print(n)
n += 1
func(n)
func(1)
def age(n):
if n == 1:
return 18
else:
return age(n-1) + 2
print(age(4))
# 输出结果
24
#
l1 = [1, 3, 5, ['太白','元宝', 34, [33, 55, [11,33]]], [77, 88],66]
def func(n):
for i in n:
if type(i) == list:
func(i)
else:
print(i)
func(l1)
# 输出结果
1
3
5
太白
元宝
34
33
55
11
33
77
88
66
python之装饰器的进阶的更多相关文章
- 进阶Python:装饰器 全面详解
进阶Python:装饰器 前言 前段时间我发了一篇讲解Python调试工具PySnooper的文章,在那篇文章开始一部分我简单的介绍了一下装饰器,文章发出之后有几位同学说"终于了解装饰器的用 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 详解python的装饰器decorator
装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
随机推荐
- Activity源码解析 - 读书笔记
1. Activity启动 Activity是一个比较好的模板方法模式.在Android系统启动时,第一个启动的进程是zygote进程,然后由zygote启动SystemServer,再后就是启动AW ...
- DOM3中的自定义事件
DOM3级还定义了自定义事件,自定义事件不是由DOM原生触发的,它的目的是让开发人员创建自己的事件.要创建的自定义事件可以由createEvent("CustomEvent"); ...
- ubuntu下pip的安装,更新及卸载
在Ubuntu下,不小心uninstall pip了,然后呢,作为小白的我,还是有些着急的,用了一些方法不好使,最后找到了这个方法: 1.安装pip3: sudo apt-get install py ...
- 关于在layui中的table checkbox 默认选中设置
一.layui版本 layui-v2.4.5 二.设置table的checkbox默认选中 总共有两种方法: 方法1:在返回的json中设置LAY_CHECKED为true,页面上的checkbox就 ...
- 复盘MySQL分页查询优化方案
一.前言 MySQL分页查询作为Java面试的一道高频面试题,这里有必要实践一下,毕竟实践出真知. 很多同学在做测试时苦于没有海量数据,官方其实是有一套测试库的. 二.模拟数据 这里模拟数据分2种情况 ...
- mongoose基本增删改查
1.安装 打开命令行 npm i mongoose 2.连接数据库 // 引入安装的包 var mongoose = require('mongoose'); mongoose.connect('mo ...
- div隐藏滚动条,仍可滚动
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 如何优雅的使用AbpSettings
在Abp中配置虽然使用方便,但是每个配置要先定义key,要去provider中定义,再最后使用key从ISetting中获取还是挺麻烦的一件事, 最主要是获取修改的时候,比如,修改用户配置,是从获取一 ...
- PG归并排序算法详解
前言 归并排序算法是连接算法中比较复杂的算法,相比嵌套循环与Hash匹配而言.本节会通过实例来说明该算法在PG中的具体实现. 在PG中,通过状态机来实现--归并-连接.当然这里的完整流程是排序--归并 ...
- C++ 线程添加互斥量
//创建互斥量 HANDLE g_hMutex = NULL; WaitForSingleObject(g_hMutex, INFINITE); ReleaseMutex(g_hMutex);