一、带参数的装饰器 (必须会)

针对不同的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之装饰器的进阶的更多相关文章

  1. 进阶Python:装饰器 全面详解

    进阶Python:装饰器 前言 前段时间我发了一篇讲解Python调试工具PySnooper的文章,在那篇文章开始一部分我简单的介绍了一下装饰器,文章发出之后有几位同学说"终于了解装饰器的用 ...

  2. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  3. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  4. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  5. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  6. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  7. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  8. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  9. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

随机推荐

  1. C++扬帆远航——18(项目五2,递归式)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:qiushi.cpp * 作者:常轩 * 微信公众号:World ...

  2. 一篇文章带您读懂Map集合(源码分析)

    今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...

  3. C#可空类型知多少

    在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullab ...

  4. Git 相关问题分享,git reset与git revert的区别?

    1.如果我在git add 后想要撤销操作,该怎么做? 使用 git rm --cache [文件名/ *] 或者 git reset HEAD, 为什么这个命令也会有效果呢,实际上reset将 HE ...

  5. 【JavaScript】DOM之表单操作

    DOM 表单操作 1.获取表单 获取表单元素 以Document对象中forms属性来获取当前HTML页面所有表单集合以Document对象中表单的name属性值来获取表单元元素 <body&g ...

  6. Xcode辅助工具之热重载插件利器

    该博客首发于github.io 2018-06-13 13:43:44 文章最新修改于: 2019-03-31 13:47:20 昨天刚刚看完iOSTips微信公众号推送的文章, Injection: ...

  7. deepin中安装pycharm过程

    安装过程真的超级简单!一遍就会! 1.下载pycharm(下载地址):https://www.jetbrains.com/pycharm/ 2.在网址中找到对应的版本:在deepin中选择linux版 ...

  8. ZYNQ入门实例——定时器中断与程序固化

    一.前言 APU系统中CPU以串行执行代码的方式完成操作,软件方式很难做到精准计时,因此调用内部定时器硬件完成计时是更好的选择.本文以定时器中断方式控制LED周期性闪烁为例学习私有定时器的使用.同时学 ...

  9. 复制url事故:出现特殊的字符%E2%80%8B

    复制url事故:出现特殊的字符%E2%80%8B 问题:直接其他地方复制过来的中文字进行网页搜索.或者中文字识别排序等情况的,会出现搜索不到的情况. 解决方法:可能存在复制源里面的文字带了空白url编 ...

  10. PHP mysql事务问题实例分析

    本文实例分析了PHP的mysql事务问题.分享给大家供大家参考,具体如下: 对于myisam数据库,可以控制事务的进行: $mysqlrl = mysql_connect ( $db_config [ ...