python decorator. decorator_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中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中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个.文章的部分例子来 ...

随机推荐

[转] JS中简单的继承与多态

这里讲了一个最最最简单的JS中基于原型链的继承和多态. 先看一下以下这段代码的实现(A是“父类”,B是“子类”): var A = function(){ this.value = 'a'; this ...

jQuery $.each用法[转]

jQuery $.each用法 以下内容非原创,来自百度文库http://wenku.baidu.com/view/4796b6145f0e7cd18425368e.html 通过它,你可以遍历对象. ...

python练习程序(c100经典例12)

题目: 判断101-200之间有多少个素数,并输出所有素数. for i in range(101,201): flag=0; for j in range(2,int(i**(1.0/2))): i ...

ES5中数组新增的方法说明

一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块,我们可能就不需要去有板有眼地for循环了. ES5中新增了写数组方法,如forEach (js v ...

MYSQL常用简单语句

使用SQL语法大写,增加可读性(小写部分就是自己数据库写的表/字段喽,具体你懂得...). 创建数据库:CREATE DATABASE mysql_db;删除数据库:DROP DATABASE mys ...

WPF集合控件实现分隔符(ItemsControl Splitter)

在WPF的集合控件中常常需要在每一个集合项之间插入一个分隔符样式,但是WPF的ItemsControl没有相关功能的直接实现,所以只能考虑曲线救国,经过研究,大概想到了以下两种实现方式. 先写出Ite ...

.net 系列:Expression表达式树、lambda、匿名委托 的使用

首先定义一个泛型委托类型,如下: public delegate T Function(T a, T b); 实现泛型委托的主体代码,并调用: public static strin ...

原生js封装cookie获取、设置及删除

使用cookie(key,value,options) 参数key,value,options(可选) function cookie(key,value,options){ if(typeof va ...

tableView与导航栏的偏移问题

//方法1.关闭自动布局 self.automaticallyAdjustsScrollViewInsets = NO; //方法2.改变相对于scrollview的位置 //contentInset ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值