python中decorator的用法及原理(一)
0、 概念
什么叫装饰器,其实也可以叫做包装器。即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来。
Python中的装饰器分为两类:函数装饰器和类装饰器。
这里我们先讨论函数装饰器。
1. 不带参数的decorator
(1) 基本用法:
def decorator1(func):
def dec(*args):
print 'pre action'
result = func(*args)
print 'post action'
return result
return dec @decorator1
def test_f1(name):
print name
return None test_f1('name1') #out: preaction/name1/post action
test_f1('name2') #out: preaction/name2/post action
(2) 这种现象的内部原理:
在python内部,当你做了这件事情:
@decorator1
def test_f1(name):
其实就是 test_f1 = decorator1(test_f1) #即test_f1作为参数传递给func。
此后的test_f1是装饰器中的dec函数对象了,而不是原来的函数的名称。当调用test_f1(‘name1’)的时候,其实调用的是dec(‘name1’)函数,而在dec函数内部,又调用了func,这样就造成了装饰器的效果。
这也解释了func是被装饰函数,*arg是被装饰函数的参数—这种现象了。
2. 带参数的decorator
(1) 基本用法:
def wap(name):
def decorator1(func):
def dec(*args):
print name
print 'pre action'
result = func(*args)
print 'post action'
return result
return dec
return decorator1 @wap('f1')
def test_f1(name):
print name
return None @wap('f2')
def test_f2(name):
print name
return None test_f1('name1') #out: f1/pre action/name1/post action
test_f2('name2') #out: f2/pre action/name2/post action
带参数的decorator,作用是通过传递参数可以定制不同的装饰器。
(2) 内部原理
这里和上面 不带参数的decorator类似,
@wap('f1')
def test_f1(name):
内部逻辑为: test_f1 = wap(‘f1’)(test_f1)
这里wap(‘f1’)返回是decorator1函数对象,这样的 话,wap(‘f1’)(test_f1)其实就是decorator1(test_f1),这样就和上面的一样了。只不过这里传递了一个参数’f1’进 入decorator内部,使得我们可以操作这个参数。
3. 函数decorator也可以修饰类成员函数
class FOO:
@decorator1
def fun(self):
print self.name
注意此时fun的self会被传递到decorator1中。此时把self看做普通的函数入参。 而且如果要使用class的属性的话,定义fun时必须带有self参数。
python中decorator的用法及原理(一)的更多相关文章
- python中hashlib模块用法示例
python中hashlib模块用法示例 我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib ha ...
- python 中del 的用法
python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于pyth ...
- python中argparse模块用法实例详解
python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...
- 【313】python 中 print 函数用法总结
参考:python 中 print 函数用法总结 参考:Python print() 函数(菜鸟教程) 参考:Python 3 print 函数用法总结 目录: 字符串和数值类型 变量 格式化输出 p ...
- python中MySQLdb模块用法实例
篇文章主要介绍了python中MySQLdb模块用法,以实例形式详细讲述了MySQLdb模块针对MySQL数据库的各种常见操作方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python中 ...
- Python Deque 模块使用详解,python中yield的用法详解
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...
- Python中super的用法【转载】
Python中super的用法[转载] 转载dxk_093812 最后发布于2019-02-17 20:12:18 阅读数 1143 收藏 展开 转载自 Python面向对象中super用法与MRO ...
- Python中With的用法
在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...
- Python中AND-OR的用法
学习Python中的lambda函数的时候,才发现原来Python中的AND和OR还可以有一些别的用法.Python中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个.文章的部分例子来 ...
随机推荐
- mysql update语句添加表关联查询
UPDATE tab_game_version as a INNER JOIN tab_game_version as b ON a.id=b.idSET a.advert_data=0 where ...
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- usb 安装系统
写在前面 本文是先安装windows再安装linux,并通过windows引导linux的启动项.这样方便linux的反复重装.折腾等. 光盘安装和U盘安装基本差不多,只是U盘安装多了把镜像文件写到U ...
- beautifulSoup安装
Python2.7 + beautifulSoup 4.4.1 安装配置 原创 2016年05月09日 10:20:30 标签: python 1261 1. 前言 最近研究python 的爬虫功能, ...
- JobTracker作业调度分析
转自:http://blog.csdn.net/Androidlushangderen/article/details/41408517 JobTracker的作业调度给我感觉就是比较宏观意义上的操作 ...
- Stanford CoreNLP 3.6.0 中文指代消解模块调用失败的解决方案
当前中文指代消解领域比较活跃的研究者是Chen和Vincent Ng,这两个人近两年在AAAI2014, 2015发了一些相关的文章,研究领域跨越零指代.代词指代.名词指代等,方法也不是很复杂,集中于 ...
- spotlight on windows 监控
1. spotlight on windows 安装 下载 https://pan.baidu.com/s/1qYi3lec Spotlight大家可以从其官方网站(http://www.quest. ...
- 亲测Google开源JPEG图片压缩算法,可将JPEG文件缩小%35
具体方法如下(windows 平台) GitHub上下载guetzli源码,地址https://github.com/google/guetzli GitHub上下载 vcpkg源码,地址https: ...
- python之MongoDB学习
import pymongo as pm # 获取连接 client = pm.MongoClient('localhost', 27017) # 端口号是数值型 # 连接数据库 db = clien ...
- JavaWeb中servlet读取配置文件的方式
我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...