修改其他函数的功能的神器——python装饰器
时间:2022-07-26
本文章向大家介绍修改其他函数的功能的神器——python装饰器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.函数装饰器介绍
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
所谓“语法糖”指的是编程语言中对功能没有影响但是能显著提高易用性和可读性的特殊语法
,本文要谈到的“装饰器”是python最重要的语法糖
,没有之一。
当需要对已有的函数添加额外的功能时:
- 个人程序-直接修改代码
- 函数封装-创建新封装函数
- 装饰器处理
2.个人程序
#对已有的函数添加额外的功能
#比如为整个程序添加个计时功能
import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
# 开始前计时
start_time=time.time()
seq=list(range(1,pow(10,6)))
x=random.sample(seq,n)
y=sorted(x)
# 结束后计时
end_time=time.time()
print("Time userd:%s"%(end_time-start_time))
return y
result=getList(1000)
print(len(result),type(result))
如果是个人程序,这样的解决方案无可厚非, 但如果是集体开发的大型项目,这样的改动通常是不被允许的, 如果大家都为了各自的需求在原函数中添加代码,很可能会造成灾难性的后果。 还有一种解决方案,就是将原函数封装到一个新的函数中, 在新函数中对原函数的运行时间进行计算。
3.函数封装
import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
seq=list(range(pow(10,6)))
x=random.sample(seq,n)
y=sorted(x)
return y
def getListTime(n):
# 开始前计时
start_time=time.time()
r=getList(n)
# 结束时计时
end_time=time.time()
print("Time userd:%s"%(end_time-start_time))
return r
result=getListTime(10000)
print(len(result),type(result))
上面代码中使用getListTime( )函数对getList( )函数进行了封装, 在getList( )函数执行前和结束后分别计时,然后求得函数耗时。 这种方案不用修改原函数中的代码, 看似可行,实际上存在很多的问题。使用该方案
- 不仅需要为每一个需要功能拓展的函数分别新建一个新函数,
- 而且还要修改所有的调用,
- 如果需要功能拓展的函数有成百上千个,可想而知会带来多大的工作量。
如何简洁优雅地实现函数的功能拓展呢?python中最佳方案是“装饰器”。
4.“装饰器”处理
import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
seq=list(range(pow(10,6)))
x=random.sample(seq,n)
y=sorted(x)
return y
def getTuple(n):
seq=list(range(pow(10,6)))
x=random.sample(seq,n)
y=tuple(sorted(x))
return y
def getListTime(func):
def wrapper(n):
# 开始前计时
start_time=time.time()
r=func(n)
# 结束时计时
end_time=time.time()
print("Time userd:%s"%(end_time-start_time))
return r
return wrapper
# result=getListTime(getList)(100)
result=getListTime(getTuple)(100)
print(len(result),type(result))
# 装饰器函数,使用函数作为参数
def decorator(func):
def wrapper(n):
start_time=time.time()
r=func(n)
end_time=time.time()
print("Time userd:%s"%(end_time-start_time))
return r
return wrapper
@decorator
def getList(n):
seq=list(range(pow(10,6)))
x=random.sample(seq,n)
y=sorted(x)
return y
result=getList(100)
# result=getListTime(getTuple)(100)
print(len(result),type(result))
# 给多个函数添加装饰器
@decorator
def getTuple(n):
seq=tuple(range(pow(10,6)))
x=random.sample(seq,n)
return tuple(x)
result=getTuple(100)
print(len(result),type(result))
# 给多参数函数添加装饰器
def decorator(func):# 1,2,3 ,host=‘localhost’ password='123456'
def wrapper(*args,**kwargs):
start_time=time.time()
r=func(*args,**kwargs)
end_time=time.time()
print("Time userd:%s"%(end_time-start_time))
return r
return wrapper
@decorator
def add_two_number(a,b):
return a+b
@decorator
def getTuple(n):
seq=tuple(range(pow(10,8)))
x=random.sample(seq,n)
return tuple(x)
add_two_number(1,2)
r=getTuple(100)
# 使用多个装饰器装饰一个函数
def decorator1(func):
def wrapper(*args,**kwargs):
print("first dec start!")
r=func(*args,**kwargs)
print("first dec end!")
return r
return wrapper
def decorator2(func):
def wrapper(*args,**kwargs):
print("second dec start!")
r=func(*args,**kwargs)
print("second dec end!")
return r
return wrapper
@decorator1
@decorator2
def add_two_number(a,b):
return a+b
add_two_number(100,200)
- Membership三步曲之入门篇 - Membership基础示例
- Java-String.intern的深入研究
- 从Membership 到 .NET4.5 之 ASP.NET Identity
- Membership三步曲之进阶篇 - 深入剖析Provider Model
- java finally深入探究
- 背后的故事之 - 快乐的Lambda表达式(一)
- 背后的故事之 - 快乐的Lambda表达式(二)
- JVM GC杂谈之理论入门
- 线程池定制初探
- 由浅入深表达式树(二)遍历表达式树
- 由浅入深表达式树(一)创建表达式树
- 重读算法导论之算法基础
- 算法之数组和问题
- 由浅入深表达式树(完结篇)重磅打造 Linq To 博客园
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shell脚本快速入门之-----数组
- JSTL
- shell脚本快速入门之-----正则三剑客之三awk用法大全!!!
- 一起来看看1stOpt到底有多强大?
- shell脚本快速入门之-----深入介绍Expect免交互
- shell脚本快速入门之-----Here document使用方法总结
- spring框架应用系列一:annotation-config自动装配
- 弄它!!!2020年了你还不懂ACL嘛,小编带你走进ACL的世界,分分钟搞定!!!
- jsp实用过滤器写法
- 搞它!!! Linux 查看CPU信息,机器型号,内存等信息
- shell脚本快速入门之----sort、uniq和tr
- 社区开源框架网络模块:ConnectionManager详解
- 搞它!!!Linux--深入介绍firewalld防火墙管理工具
- 搞它!!! 深入介绍iptables防火墙管理工具
- ZooKeeper的十二连问,你顶得了嘛?