python 14 装饰器
装饰器
1. 开放封闭原则
扩展是开放的,增加新的功能;修改源码(修改已经实现的功能)是封闭的。
在不改变源码及调用方式的前提下额外增加新的功能。
# 版一:
import time
start_time = time.time() #起始时间
def func():
time.sleep(2) #睡眠,模拟网络延迟
print("我要飞")
func()
print(time.time()- start_time) # 打印执行世界
# 版二:
import time
def times(s):
start_time = time.time()
s()
print(time.time()- start_time)
def foo():
time.sleep(2)
print("我要飞")
times(foo) #改变了调用方式
# 版三(初版装饰器):
import time
def times(s):
def inner():
start_time = time.time()
s()
print(time.time()- start_time)
return inner
def func():
time.sleep(1)
print("我也要飞")
func = times(func) # 不需改调用方式
func()
# 版四(升级):
def wrapper(f):
def inner(a): #加入参数
f(a)
return inner # 切记不加括号
def func(a): # 加参数
print(f"这是{a}的函数")
func = wrapper(func)
func("alex")
# 升级 万能传参:
import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
print(time.time() - start_time)
return inner # 切记不加括号
def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
func = wrapper(func)
func("alex",1,2,a = 3,b = 4)
def foo(*args,**kwargs): # 加形参
time.sleep(2)
print(f"这是{args,kwargs}的函数")
foo = wrapper(foo)
foo("meet",1,2,a = 3,b = 4)
#语法糖 放在被装饰函数的上方
#替代func = wrapper(func) 和 foo = wrapper(foo)
import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
print(time.time() - start_time)
return inner # 不加括号
@wrapper #语法糖
def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
# func = wrapper(func)
@wrapper #语法糖
def foo(*args,**kwargs): # 加形参
time.sleep(2)
print(f"这是{args,kwargs}的函数")
# foo = wrapper(foo)
func("alex",1,2,a = 3,b = 4)
foo("meet",5,6,a = 7,b = 8)
# 标准版:
import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
print(time.time() - start_time)
return ret #增加返回值
return inner # 切记不加括号
@wrapper #语法糖
def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
return "这是alex的返回"
print(func("alex",1,2,a = 3,b = 4)) # 会打印"这是alex的返回"
#语法糖 放在被装饰函数的上方
#标准版的装饰器:
def wrapper(func):
def inner(*args,**kwargs):
'''执行被装饰函数之前的操作'''
ret = func(*args,**kwargs)
'''执行被装饰函数之后的操作'''
return ret # 返回inner(),也就是func()打印
return inner
@wrapper # 相当于 func = wrapper(func)
def func(*args,**kwargs)
print(args,kwargs)
return "返回的内容" # 返回ret
print(func()) # 能够打印返回值,也可以传参
python 14 装饰器的更多相关文章
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- Python的装饰器实例用法小结
这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
随机推荐
- 数据挖掘之KMeans算法应用与简单理解
一.背景 煤矿地磅产生了一系列数据: 我想从这些数据中,取出最能反映当前车辆重量的数据(有很多数据是车辆上磅过程中产生的数据).我于是想到了聚类算法KMeans,该算法思想比较简单. 二.算法步骤 1 ...
- PHP语句中or的用法
经常看到这样的语句: $file = fopen($filename, 'r') or die("抱歉,无法打开: $filename"); or在这里是这样理解的,因为在P ...
- arm汇编指令--str ldr
STR :把寄存器中的字保存到存储器(寄存器到存储器) 示例: STR R0,[R1],#8 :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR ...
- lr参数化
为什么做参数化? 数据库校验:注册用户时会看数据库有没有这个账号 应用程序校验:pc端qq登陆,一个账号只能登陆一台电脑 1.数据库或应用程序提交值的唯一性校验 数据库查询过程: 1.语法检查.语义检 ...
- 【SVN】eclipse 安装 SVN 插件
链接:eclipse中svn插件的安装 SVN 插件地址:http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=8EB28B11 ...
- python3 实现多域名批量访问特定目录(一)
渗透测试之批量处理同一框架CMS系统漏洞 当我们做多网站的渗透测试时,会发现很多站点采用的都是同类型的CMS框架,只要我们发现一个漏洞,那么我们可以批量处理这一类站点,高效测试,如果不知道该站点的框架 ...
- Js面向对象构造函数继承
构造函数继承 <!-- 创建构造函数 --> function Animal(){ this.species= '动物'; } function Dog(name,color){ this ...
- How to check all timestamps of a file
A friend of mine she asked me how to check all timestamps of a file on an NTFS volume. She did not h ...
- 2019前端面试系列——HTTP、浏览器面试题
浏览器存储的方式有哪些 特性 cookie localStorage sessionStorage indexedDB 数据生命周期 一般由服务器生成,可以设置过期时间 除非被清理,否则一直存在 页面 ...
- Windows 纠错
4:在Windows应用程序中,当需要将窗体显示为模式对话框时,需要调用窗体的()方法.(选择一项)A:Activate()B:ShowDialog()C:Show()D:Close()正确答案是 B ...