python课堂整理21---初识装饰器
一、装饰器:
本质就是函数,功能:为其他函数添加附加功能
原则:
1.不能修改被装饰函数的源代码
2.不能修改被修饰函数的调用方式
一个简单的装饰器
import time
def timmer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
stop_time = time.time()
print('函数运行的时间%s'%(stop_time - start_time)) return res
return wrapper @timmer
def cal(l):
res = 0
for i in l:
time.sleep(0.01)
res += i
return res
ret = cal(range(200))
print(ret)
二、装饰器的知识储备
装饰器 = 高阶函数 + 函数嵌套 + 闭包
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
用高阶函数模拟装饰器:
结果多运行了一次
import time
def foo():
time.sleep(3)
print('来自foo') def timmer(func):
start_time = time.time()
func()
stop_time = time.time()
print('函数运行的时间是%s' %(stop_time - start_time))
return func
foo = timmer(foo)
foo()
三、 函数嵌套及闭包
嵌套就是,函数里再定义函数
闭包:闭----->封装的变量 包----->一层层函数
每个包找变量先从自身那层开始找,找不到再从外层找
重点:函数即变量
def father(name):
def son():
print('我的爸爸是%s' %name)
def grandson():
name = 'China'
print('我的爷爷是%s' %name)
grandson()
son()
father('河南')

装饰器框架
def timmer(func):
def wrapper():
#增加功能
func() return wrapper
补充该装饰器架子
import time
def timmer(func):
def wrapper():
#增加功能
start_time = time.time()
func()
stop_time = time.time()
print('运行时间是%s'%(stop_time - start_time))
return wrapper def test():
time.sleep(2)
print('test函数运行完毕') res = timmer(test) #返回的是wrapper的地址
res() #执行的是wrapper()

可以看出,只要把函数的最后两行代码的函数接收值改为:test
即:
test= timmer(test) test()
看起来符合装饰器原则
但每次给函数增加功能都得写一遍 test= timmer(test),显然不合理
所以,用@timmer 去代替test = timmer(test)
import time
def timmer(func):
def wrapper():
#增加功能
start_time = time.time()
func()
stop_time = time.time()
print('运行时间是%s'%(stop_time - start_time))
return wrapper
@timmer #就相当于:test = timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕')
test()
四、加上返回值的装饰器
import time
def timmer(func):
def wrapper():
#增加功能
start_time = time.time()
res = func() #这里执行的函数test,所以要在这里给函数一个接收返回值的变量
stop_time = time.time()
print('运行时间是%s'%(stop_time - start_time))
return res #这里要返回test的返回值
return wrapper
@timmer #就相当于:test = timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕')
return '这是test的返回值'
a = test()
print(a)
五、加上参数的装饰器
import time
def timmer(func):
def wrapper(*args, **kwargs): #可接受任意值
#增加功能
start_time = time.time()
res = func(*args, **kwargs) #将wrapper接受的值原封传给func
stop_time = time.time()
print('运行时间是%s'%(stop_time - start_time))
return res
return wrapper
@timmer #就相当于:test = timmer(test)
def test1(name, age, gander):
time.sleep(2)
print('test1运行结果名字为%s年龄为%d性别为%s'%(name, age, gander))
return '这是test1的返回值'
a = test1('jinling', 20, 'female')
print(a) @timmer
def test2(name, age):
time.sleep(3)
print('test2函数运行结果名字为%s年龄为%d'%(name, age))
return '这是test2的返回值'
b = test2('liuwen', 18)
print(b)

六、实现一个验证功能装饰器
def func_ver(func):
def wrapper(*args, **kwargs):
name1 = input('请输入用户名:')
pd = input('请输入用户密码:')
if name1 == 'PJL' and pd == '123':
func(*args, **kwargs)
else:
print('用户名或密码错误') return wrapper @func_ver
def index():
print('欢迎来到的我的网站')
@func_ver
def home(name):
print('%s欢迎回家'%name)
@func_ver
def secrect(name):
print('%s这是你的小秘密'%name) index()
home('jinling')
secrect('jining')

python课堂整理21---初识装饰器的更多相关文章
- python基础整理4——面向对象装饰器惰性器及高级模块
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- Python 函数修饰符(装饰器)的使用
Python 函数修饰符(装饰器)的使用 1. 修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...
- Python基础(八)装饰器
今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...
- Python(三)对装饰器的理解
装饰器是 Python 的一个重要部分,也是比较难理解和使用好的部分.下面对装饰器做一下简单整理 1. 前言 装饰器实际上是应用了设计模式里,装饰器模式的思想: 在不概念原有结构的情况下,添加新的功能 ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- Python 标准库中的装饰器
题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...
随机推荐
- spring boot之actuator简介
当我们的开发工作进入尾声,部署上线之后,对于一个程序而言,可能才刚刚开始,对程序的运行情况的监控要伴随着整个生命周期. 如果这个工作由程序员自己来开发,也未尝不可,但本着不重复制造轮子的思想,我们尽量 ...
- top命令的使用
原地址:https://mp.weixin.qq.com/s/DVX86UgZDiTspVe497KKWw
- 查看linux系统时间和时区
参考地址:http://lidao.blog.51cto.com/ 一.使用date命令查看系统时间 [root@benbang ~]# date -R Tue, 01 Aug 2017 15:43: ...
- Python 爬虫从入门到进阶之路(八)
在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...
- LR编写Socket脚本方法1(XML/16进制报文data.ws格式)
本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法.1.socket协议介绍Socket协议有万能协议之称,很多系统底层都是用的s ...
- 【Webkit Blog翻译】深入研究WebRTC | 内有福利
本文译自 A Closer Look Into WebRTC” 我们在最近的一篇 WebKit博客中宣布了对High Sierra平台和iOS中Safari的WebRTC支持.现在,我们希望能够带领大 ...
- spring cloud 系列第8篇 —— config+bus 分布式配置中心与配置热刷新 (F版本)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.config 简介 spring cloud config 分为服务端 ...
- 【IDE】idea在debug模式启动非常慢,debug模式一直在启动中状态
现象:一直处于启动中状态,日志刷的很慢,非debug模式正常启动: 最终解决方式:下图按钮,取消所有打过的断点,问题解决
- Python笔记【2】_列表学习
#!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctrl+左键 #字符串:通常有单引号“'”.双引号“" ...
- <h2>js数组操作大全(pop,push,unshift,splice,shift方法)</h2>
---恢复内容开始--- shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a ...