Python学习笔记: 装饰器Decorator
介绍
装饰器是对功能函数的加强. 在原来的功能函数之外,另外定义一个装饰器函数,对原来的功能函数进行封装(wrapper)并在wrapper的过程中增加一些辅助功能。
应用场景
如下场景:
业务函数func_biz_1(), func_biz_2()... 里面写的是业务逻辑代码。如果我们现在希望在每个函数里面增加一些辅助功能(比如打印日志,计算函数运行时间)
这些辅助功能的代码都是通用的。不使用decorator的情况下我们就要在业务函数里面增加这些辅助代码,缺点:
- 辅助功能的代码重复copy到每个功能func中
- 修改辅助功能的代码很麻烦
- 业务func里面同时有业务逻辑和辅助功能的代码混在一起。代码量变大,且非常乱。
要解决这个问题就要用装饰器,将业务函数封装(wrapper),在wrapper的过程中将辅助功能代码加进去。
代码例子
不用装饰器
一个函数里面既有主业务逻辑(打印质数),又有辅助功能(对函数执行时间计时)
import time
# 判断输入的num是否是质数
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到10000之间所有的质数
def prime_numbers():
''' print all the prime numbers btw 2...10000
print the onsumed time
'''
t_start = time.time()
for i in range(2, 10000):
if is_prime(i):
print(i)
t_stop = time.time()
print("time consumed: {}".format(t_stop - t_start))
prime_numbers()
缺点: 统计时间的代码和业务代码混在一起写在prime_numbers()里面
用装饰器
import time
# 定义一个装饰器: 统计函数运行时间
def display_time(func):
''' define a decorator函数,参数是函数 '''
def wrapper():
t_start = time.time()
func()
t_stop = time.time()
print("time consumed: {:.4}".format(t_stop - t_start))
return wrapper
# 判断输入的num是否是质数
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到10000之间的质数count
@display_time
def prime_numbers():
''' count the prime numbers btw 2...10000 '''
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_numbers() # 运行它的时候实际上运行的是装饰器函数wrapper()
通过装饰器实现了业务逻辑与主服务功能的分离
Python学习笔记: 装饰器Decorator的更多相关文章
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- Python学习笔记--装饰器的实验
装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...
- python语法32[装饰器decorator](转)
一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...
- python 语法之 装饰器decorator
装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- 学习笔记——装饰器模式Decorator
装饰器模式,最典型的例子. 工厂新开了流水线,生产了手机外壳,蓝天白云花色.刚准备出厂,客户说还要印奶牛在上面,WTF…… 时间上来不及,成本也不允许销毁了重来,怎么办?弄来一机器A,专门在蓝天白云的 ...
- 浅析python中的装饰器decorator
最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...
- [转] Python中的装饰器(decorator)
想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
随机推荐
- Redis 系统学习目录
Redis 系统学习目录 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8. ...
- 【flareon6】 overlong-通过动调改内存修改程序
程序分析 无壳,32位程序 运行后结果 程序比较简单一共三个函数 根据题目和运行结果可以看出来是a3太小了,没法完全解密密钥 解决该问题可以通过写脚本或动调解决 方法一:动调改内存 定位到a3入栈的位 ...
- 渲染一个react?
分为首次渲染和更新渲染 生命周期, 建立虚拟DOM, 进行diff算法 对比新旧DOM, 节点对比, 将算法复杂度从O(n^3)降低到O(n) key值优化, 避免用index作为key值, 兄弟节点 ...
- 说说 RPC 的实现原理?
首先需要有处理网络连接通讯的模块,负责连接建立.管理和消息的传输.其次需要有编解码的模块,因为网络通讯都是传输的字节码,需要将我们使用的对象序列化和反序列化.剩下的就是客户端和服务器端的部分,服务器端 ...
- JWT jti和kid属性的说明
jti chaim=== JWT ID " jti"(JWT ID)声明为JWT提供了唯一的标识符. 标识符值的分配方式必须确保将相同值偶然分配给不同数据对象的可能性可以忽略不计: ...
- 什么是 rabbitmq ?
采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需 要确保提供方存在,实现了服务之间的高度解耦
- 攻防世界 Ditf misc
Ditf 附件下载下来就是一张图片,我们拉到hxd中发现应该有隐藏的压缩包 我们拉入到kali里面分析 意外发现图片高度被修改过我们先用binwalk分析图片看看 我们先尝试分离一下分离出一个压缩包但 ...
- poj_3253_priority queue
描述 农夫约翰想要修篱墙,他需要N块木板,第i块板长Li.然后他买了一块很长的板子,足够他分成N块.忽略每次锯板子带来的损失. 约翰忘记买锯子了,于是像Don借.Don要收费,每次锯一下,就要收一次板 ...
- 在一个元素上:hover,改变另一个元素的css属性
如果二者是父子关系,可以写成这种: .face:hover .eye-bottom { margin-top: 30px; } 如果是兄弟关系: .face:hover+.ear-wrap { tra ...
- ionic3 教程(五)基本的网络请求
链接: ionic3教程(一)安装和配置 ionic3教程(二)登录页制作 ionic3教程(三)设置页制作 ionic3教程(四)安卓硬件返回键处理ionic3 教程(五)基本的网络请求 这是最后一 ...