Python进阶(六)----装饰器
Python进阶(六)----装饰器
一丶开放封闭原则
开放原则:
增加一些额外的新功能
封闭原则:
不改变源码.以及调用方式
二丶初识装饰器
装饰器:
也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包
###普通版装饰器
import time
def timmer(x): # x 接收的原函数的内存地址
def inner():
start_time=time.time()
x() # 执行 原函数
print(f'执行效率{time.time()-start_time}')
return inner
def index():
time.sleep(2)
print(f'欢迎访问本站博客园')
index=timmer(index) #将timmer函数执行的结果返回,付给index变量
index() #这里执行的inner函数
###标准版 @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
import time
def timmer(func): # 此时 func 就是一个自由变量
def inner():
start_time = time.time()
func() # func 是timmer函数传递过来的index原函数的内存地址
print(f'执行效率 {time.time() - start_time}')
return inner
@timmer # 等同于 index=timmer(index) 往下读一行
def index():
time.sleep(2)
print('登录成功')
index() #这里执行的inner函数
三丶被装饰函数带返回值
###需求被装饰函数有返回值
import time
def timmer(func): # 这里argv 接收的真正要执行的原函数.
def inner():
start_time=time.time()
var=func()
print(f'{time.time()-start_time},{args[0]},{args[1]}')
return var #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
return inner
@timmer
def index(*args,**kwargs):
time.sleep(2)
print('进入到网页index页面')
return True # 原函数 最重返回的结果是 True
print(index(1,2)) # 这里是执行 inner方法
四丶被装饰函数带参数
###需求 被装饰函数有参数
import time
def timmer(func):
def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
# 函数定义时 , * ,** 代表聚合
start_time=time.time()
res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
# 函数执行时 ,* ,** 代表打散
print(f'{time.time()-start_time} 这是{args[0]}')
return res
return inner
@timmer
def index(args):
time.sleep(2)
print(f'welcome {args}')
return True
index('都来看')
五丶标准终终结版装饰器
###### 装饰器原版 ####
def warpper(func):
def inner(*args,**kwargs):
'''被装饰器之前的操作'''
ret=func(*args,**kwargs)
'''被装饰函数之后的操作'''
return ret
return inner
####拓展版 计算index函数执行的效率
import time
def timmer(func):
def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
# 函数定义时 , * ,** 代表聚合
start_time=time.time()
res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
# 函数执行时 ,* ,** 代表打散
print(f'{time.time()-start_time} 这是{args[0]}')
return res #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
return inner #返回inner函数, 给index重新赋值.
@timmer #语法糖,等同于 index=timmer(index) , 把index原函数作为形参传递给timmer函数func
def index(args): # 原函数具有传参的功能
time.sleep(2)
print(f'welcome {args}')
return True # 原函数具有返回值的功能
index('都来看') # 执行的是inner函数,把参数传递给inner函数,
####装饰器:
#1.必须存在嵌套函数中
#2.必须存在内存函数对外层函数(非全局变量)的引用
#3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
#4.内层函数必须能够接收原函数传递的参数
#5.内存函数执行完必须返回原函数要返回的结果
####装饰器约束:
#1.不得更改源码,
#2.不能更改调用方式
####应用场景:
#用户登录验证
#打印日志
Python进阶(六)----装饰器的更多相关文章
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- Python进阶之装饰器
函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...
- Python进阶: Decorator 装饰器你太美
函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message): print('Got a message: {}'.format(message)) send ...
- python进阶(三)~~~装饰器和闭包
一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...
- [Python进阶]002.装饰器(1)
装饰器(1) 介绍 HelloWorld 需求 使用函数式编程 加入装饰器 解析 介绍 Python的装饰器叫Decorator,就是对一个模块做装饰. 作用: 为已存在的对象添加额外功能. 与Jav ...
- python进阶:装饰器
1.闭包 简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用. def out_func(n): num = 100 def in_fucn(*args,**kwargs): # no ...
- Python进阶(装饰器)
from datetime import datetime def log(func):#func表示装饰器作用于的函数 def wrapper(*args,**kw):#wrapper返回装饰器作用 ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
随机推荐
- Win7下如何使用tracert命令查看网络状况?
大家平时在访问的网站中,是不是有一些网站访问速度很快,而有些网站却访问的很慢呢?甚至有些网站无法访问.那你们知道该怎么判断这些网站的访问速度呢?不知道的话,那就使用Windows的tracert命令来 ...
- (转)LoadRunner之录制你的第一个脚本
LoadRunner安装完成之后,肯定就迫不及待的想要上手试用了.下面就是讲一下LR脚本录制的流程和基本的设置. 1.先放一张脚本录制以及运行的流程图 2.脚本录制步骤 1)以管理员身份打开LR软件, ...
- iOS逆向(五)-ipa包重签名
为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...
- Linux下SQL Server安装及数据库迁移
有客户使用Linux服务器,SQL Server从2017开始已支持Linux,从未用过,今天测试了一下,比较简单,记录一下. Linux:CentOS 7.0 首先更新源: curl -o /etc ...
- java读取IFC文件
The IFC JAVA Toolbox can read IFC STEP files and IFCZIP files from any data source that implementsja ...
- C++11 并发编程库
C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...
- go 代码玩耍
//小游戏 num := rand.Intn() var input int fmt.Println("请输入数字") fmt.Scanf("%d", & ...
- Laradock中文文档
文档地址:https://laradock.linganmin.cn
- 【C/C++开发】C++11:左值引用VS右值引用
左值引用VS右值引用 左值引用对于一般的C++程序员再熟悉不过,但对于右值引用(C++0X新特性),就稍微有点不知所云 左值VS右值 在定义变量的时候,经常会用到左值和右值,比如:int a = 1; ...
- JS系列:三元运算符与循环
三元运算符 语法: 条件?成立做的事情:不成立做的事情:<=>相当于简单的if/else判断(简化写法) var num = 12; if(num>10){ num ++; }el ...