python 装饰器理解
简介
装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志、性能测试、事务处理、缓存等
装饰器的前提
闭包
一般来说,当一个函数嵌套另一个函数时,内部函数引用到了外部函数的变量,则形成了闭包,如下所示,outter与inner形成了闭包
def outter():
n = 1
def inner():
print(n)
return n
return inner()
print(outter())
闭包的作用
1.内部函数可以访问外部函数的变量
2.将外层变量持久化到内存中(一般来说,函数内部的局部变量在这个函数运行完以后,就会被Python的垃圾回收机制从内存中清除掉)
装饰器的实现方式
方法装饰器
直接创建
def outter(func):
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner
@outter
def decorator():
'''decorator'''
print('decorator')
decorator()
print(decorator.__name__)
print(decorator.__doc__)
由此结果发现,当添加装饰器后会改变原有函数的__name__及__doc__属性,为此我们需要纠正回来
修改函数的名及注释
使用functools下的wraps转译
from functools import wraps
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner
@outter
def decorator():
'''decorator'''
print('decorator')
decorator()
print(decorator.__name__)
print(decorator.__doc__)
可传参的装饰器
需要在外层再包装一个函数,传入需要传递的参数即可,传入的参数也可以用于内部逻辑代码的处理
from functools import wraps
def decorator(name):
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print(f'name:{name}')
print('inner start')
return func(*args, **kwargs)
return inner
return outter
@decorator(name='test')
def test():
print('test')
test()
类装饰器
直接创建(不带参数)
类装饰器不携带参数,只需构造方法传入方法,重写__call__方法即可
class Decorator():
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print('Decorator start')
self.func(*args, **kwargs)
print('Decorator finish')
@Decorator
def test():
print('test')
test()
携带参数创建
对于携带参数的类装饰器,构造方法需要为参数, 需要重写__call__方法且需要添加内部函数并返回,__call__方法传入方法,内部函数传递被装饰的函数的参数
class Decorator():
def __init__(self, name):
self.name = name
def __call__(self, func):
def inner(*args, **kwargs):
print('inner start')
print(self.name)
func(*args, **kwargs)
print('inner finish')
return inner
@Decorator(name='test')
def test():
print('test')
test()
python 装饰器理解的更多相关文章
- python装饰器理解
1.装饰器的作用 在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能 原则: 1.不修改被装饰对象的源代码2.不修改被装饰对象的调用方式 目标: 为被装饰对象添加新功能 2.装饰器的 ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- 如何理解Python装饰器
如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- python 装饰器的理解以及类装饰器
python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...
- Python装饰器的通俗理解
转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...
- (一)Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- 【Python】装饰器理解
以下文章转载自:点这里 关于装饰器相关的帖子记录在这里: 廖雪峰, thy专栏, stackflow Python的函数是对象 简单的例子: def shout(word="yes" ...
随机推荐
- Java 14中对switch的增强,终于可以不写break了
面对这样的if语句,你是不是很难受呢? if (flag == 1) { log.info("didispace.com: 1"); } else if (flag == 2) { ...
- node技术是啥?
node.js 一句话,就是把js代码放在服务器段运行的一种技术.
- Sharding JDBC案例实战
基础分库 以下实例基于shardingsphere 4.1.0 + SpringBoot 2.2.5.RELEASE版本 依赖导入: <properties> <project.bu ...
- 200 行代码实现基于 Paxos 的 KV 存储
前言 写完[paxos 的直观解释]之后,网友都说疗效甚好,但是也会对这篇教程中一些环节提出疑问(有疑问说明真的看懂了 ),例如怎么把只能确定一个值的 paxos 应用到实际场景中. 既然 Talk ...
- R-CNN学习笔记
R-CNN学习笔记 step1:总览 步骤: 输入图片 先挑选大约2000个感兴趣区域(ROI)使用select search方法:[在输入的图像中寻找blobby regions(可能相同纹理,颜色 ...
- React简单教程-5-使用mock
前言 一个前后端分离的项目,前端人员需要对接后端的接口.如果在后端的接口没有开发好,或者没有测试版可以对接的情况下,前端人员也不能坐等后端接口写好后再开始开发. 一个项目的,理想情况下接口的规范应该是 ...
- Eclipse For Java开发环境部署
Eclipse For Java开发环境部署 1.准备工作 jdk安装包 jdk官网下载 Eclipse安装包 Eclipse官网下载 Eclipse下载时选择图中所示的国内镜像地址下载 下载后的文件 ...
- 使用PowerShell安装MySQL
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年7月10日. 2022年4月16日:更新MySQL下载链接. 一.说明与准备工作 根据MySQL官网提供的安装M ...
- 表达式的动态解析和计算,Flee用起来真香
前言 在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出:由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的 ...
- JS:自增和自减
自增自减是一元操作符运算 1.++: 前置++:先把取值,再把变量的值加1 后置++:先把变量的值加1,再取值 2.--: 前置--:先把取值,再把变量的值加1 后置--:先把变量的值加1,再取值 v ...