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,需要的朋友可以参考下 装饰器对与 ...
随机推荐
- 后台启动es head,关闭shell后es head自动关闭
后台启动head命令:grunt server & 注意:加上&虽然执行了后台启动,但还是有日志打印出来,使用ctrl+c可以退出.这时如果直接关闭shell, head进程就会终止 ...
- IDEA 如何导出 todo 列表
众所周知,IDEA 可以直接查看所有的 todo 列表, 快捷键是 Alt + 6 然后右键文件夹,选择[Expand All],展开所有目录 再然后,先选中最上边的文件,单击, 再选中最后一个文件, ...
- 使用ssh-keygen生成私钥和公钥
1.使用ssh-keygen生成私钥和公钥 命令如下: ssh-keygen -t rsassh-keygen -t rsa -C "用户名自取"可以是邮箱 例子: fdipzon ...
- exception: TypeError: Cannot read property '_modulesNamespaceMap' of undefined at getModuleByNamespac
用 Vue.extend 创造的组件构造器和组件,默认是不集成 store 和 router 的. 比如 main.js 中的这个,其实是挂载在根组件 vm 中.并不是注入到全局 Vue 中.所以你用 ...
- Flume监控指标项
配置监控 1.修改flume-env.sh export JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmx ...
- svn 清除用户名和密码
- windows cmd ftp 自动下载
1.编写ftp的bat脚本: set year=%,% set day=%,%%,%%,% mkdir d:\ftp\%,% mkdir d:\ftp\%,%\%,%%,%%,% del d:\ftp ...
- WMS日常运维_WJC
3.25.奥克斯项目Apache的server reached MaxClients setting问题 apachelog报错:[mpm_worker:error] [pid 2486:tid 14 ...
- Idea导入maven项目没有识别
选中module的pom.xml,右键,选择" add as maven project",idea会识别该pom的项目
- aix如何将history输出所有命令导出到文本文件
more .sh_history cat .sh_history > mylogfile.txt