一、装饰器:

本质就是函数,功能:为其他函数添加附加功能

原则:

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---初识装饰器的更多相关文章

  1. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  2. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  3. Python 函数修饰符(装饰器)的使用

     Python 函数修饰符(装饰器)的使用 1.  修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...

  4. Python基础(八)装饰器

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...

  5. Python(三)对装饰器的理解

    装饰器是 Python 的一个重要部分,也是比较难理解和使用好的部分.下面对装饰器做一下简单整理 1. 前言 装饰器实际上是应用了设计模式里,装饰器模式的思想: 在不概念原有结构的情况下,添加新的功能 ...

  6. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

  7. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  8. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  9. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

随机推荐

  1. spring boot之actuator简介

    当我们的开发工作进入尾声,部署上线之后,对于一个程序而言,可能才刚刚开始,对程序的运行情况的监控要伴随着整个生命周期. 如果这个工作由程序员自己来开发,也未尝不可,但本着不重复制造轮子的思想,我们尽量 ...

  2. top命令的使用

    原地址:https://mp.weixin.qq.com/s/DVX86UgZDiTspVe497KKWw

  3. 查看linux系统时间和时区

    参考地址:http://lidao.blog.51cto.com/ 一.使用date命令查看系统时间 [root@benbang ~]# date -R Tue, 01 Aug 2017 15:43: ...

  4. Python 爬虫从入门到进阶之路(八)

    在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...

  5. LR编写Socket脚本方法1(XML/16进制报文data.ws格式)

    本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法.1.socket协议介绍Socket协议有万能协议之称,很多系统底层都是用的s ...

  6. 【Webkit Blog翻译】深入研究WebRTC | 内有福利

    本文译自 A Closer Look Into WebRTC” 我们在最近的一篇 WebKit博客中宣布了对High Sierra平台和iOS中Safari的WebRTC支持.现在,我们希望能够带领大 ...

  7. spring cloud 系列第8篇 —— config+bus 分布式配置中心与配置热刷新 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.config 简介 spring cloud config 分为服务端 ...

  8. 【IDE】idea在debug模式启动非常慢,debug模式一直在启动中状态

    现象:一直处于启动中状态,日志刷的很慢,非debug模式正常启动: 最终解决方式:下图按钮,取消所有打过的断点,问题解决

  9. Python笔记【2】_列表学习

    #!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctrl+左键 #字符串:通常有单引号“'”.双引号“" ...

  10. <h2>js数组操作大全(pop,push,unshift,splice,shift方法)</h2>

    ---恢复内容开始--- shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a ...