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

针对不同的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. Machine-learning-DecisionTree

    前言 决策树是一种自上而下,对样本数据进行树形分类的过程,由结点和有向边组成.结点分为内部结点和叶结点,其中每个内部结点表示一个特征或属性,叶节点表示类别.从顶部根节点开始,所有样本聚在一起,经过根节 ...

  2. C++扬帆远航——17(递归函数求阶乘)

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

  3. python基础知识的重新认识

    昨天模拟书本上client和server交互的例子,代码明明是按照书上写的,可是就是出现了错误,像下面这样: # tcpserver from socket import * from time im ...

  4. Asp.Net Core EndPoint 终点路由工作原理解读

    一.背景 在本打算写一篇关于Identityserver4 的文章时候,确发现自己对EndPoint -终结点路由还不是很了解,故暂时先放弃了IdentityServer4 的研究和编写:所以才产生了 ...

  5. MVC03

    1.添加model model 的作用是什么? 处理项目的数据模型,与数据库交互 .net推荐的处理数据的方式:使用 idd framework 1)新建model 右键models文件夹,选择添加, ...

  6. [红日安全]Web安全Day9 - 文件下载漏洞实战攻防

    本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...

  7. I - A计划 HDU - 2102

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. 使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期

    面试问题 Redis 如何实现查询附近的人? 涉及知识点 Redis 中如何操作位置信息? GEO 底层是如何实现的? 如何在程序实现查询附近的人? 在实际使用中需要注意哪些问题? 视频答案 视频地址 ...

  9. 【colab pytorch】使用tensorboard可视化

    import datetime import torch import torch.nn as nn import torch.nn.functional as F import torch.opti ...

  10. Oracle 11g rac中关于crsctl stop cluster/crs/has的区别

    转载至http://www.oracleplus.net/arch/1203.html,整理后得. 1 通过命令查看cluster/has/crs管理的内容 [root@11rac1 ~]# crsc ...