Python函数加工厂-装饰器
引言:
函数和装饰器好比程序界的加工厂:
1、函数一般可用来加工一种或者多种数据类型的数据:字符串、数字、列表、字典等
举一个简单例子:已知半径求面积

def s(r):
s = 3.14 * r * r
return s
调用s函数:输入4,输出半径为4的圆的面积。a相当于面积的容器
a = s(4)
print(a)
2、装饰器是用来装饰函数的函数。其需要输入的原材料为某个函数
以下是装饰器的固定格式:
def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re = func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner
timer函数是一个进化函数的函数:装饰器
timer是用来加工函数的,即产品应该也应该是函数(进化版)。
def timer(func):
#
#func的进化过程
#
return inner # 强化变身版func
上面的代码就比较容易理解了,就是定义一个函数去强化函数,得到一个强化func
接下来,我们就深入研究func的强化过程:
1、你return了一个inner函数,他不是凭空产生的,就是石猴还不远万里去学艺,并取了了名字叫孙悟空呢。
所以一开始你要:
def inner(*args,**kwargs): # inner 今天成立了
我们知道inner是为了强化加工厂func的,所以inner需要的原材料必须是和func一样的。启动万能可变参数(*args,**kwargs)
def inner(*args,**kwargs):
'''执行函数之前要做的''' # 强化1
re = func(*args,**kwargs) # 这个是原函数的核心部件,你就不要随便动他了。。。否则,你为啥不自己写一个程序。。。
'''执行函数之后要做的''' #强化2
return re
我们再讲一下为啥要要有 re 这个东西,还要return
因为这就是func原工厂生产的东西啊。。。没有return 你就丢了啊
到了最后变身的 时候了。。。
hahaha之前是一个小小加工厂,注册资金只有10w
后来王思聪老公投资了1亿,hahaha立马走上人生巅峰
inner 是哈哈哈被timer(王思聪)强化后的hahaha
这时候工商局找来了。。。指着inner说,你不就是原来的hahaha么,必须在我这更改相关信息,但是名字就不能改了
认证:hahaha = timer(hahaha) # 注册资金1亿
后来工商局发现经常性工厂升级,所以后来就直接在营业执照上盖了个戳
@timer
讲了这么多,就是为了加深大家的理解,其实记住下面的就好了
def wrapper(func):
def inner(*args,**kwargs):#定义函数的时候——*参数的聚合
ret = func(*args,**kwargs) #调用函数的时候——*参数的打散
#func是被装饰的函数,ret是被装饰函数的返回值
return ret #把被装饰的函数的返回值返回给调用者
return inner
带参数的装饰器
假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer @outer(False)
def func():
print(111) func()
多个装饰器装饰同一个函数

def wrapper1(func):
def inner():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner def wrapper2(func):
def inner():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner @wrapper2
@wrapper1
def f():
print('in f') f()
附加:关于可变参数的应用

#动态参数
def ccc(*args):#1,2,3,4,5
print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1,2,3,4,5)
ccc(t) ((1, 2, 3, 4, 5),)
ccc(*t) (1, 2, 3, 4, 5) def ddd(**kwargs):
print(kwargs) # ddd(k = 'a',j = 'b')#按关键字传参数 def eee(*args,**kwargs):
print(args,kwargs) # eee(12,123) #先按位置传参,再按关键字传参 def ccc(*args):
print('ccc:',args) #(1,2,3,4,5)
def inner(a,b,c,d,e):
print('inner',a,b,c,d,e)
inner(*args) #*(1,2,3,4,5) 打散 def inner(a,b,c,d,e):
print('inner',a,b,c,d,e)
# ccc(1,2,3,4,5)
# inner(1,2,3,4,5)

Python函数加工厂-装饰器的更多相关文章
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- python——函数之装饰器
1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- Python 函数之装饰器
1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- Python函数的装饰器
函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- MongoDB的容量规划及硬件配置
mongo是基于内存的数据库,应尽量将工作集中的数据全部加载到内存中,即内存应大于工作集 本文译自Chad Tindel的英文博客: http://www.mongodb.com/blog/post/ ...
- C++ STL标准模板库(vector)
//vector的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using na ...
- 说明Oracle数据库逻辑备份和物理备份的方式。
说明Oracle数据库逻辑备份和物理备份的方式. 解答:Oracle备份包括逻辑备份和物理备份. 1).逻辑备份 数据库的逻辑备份包含读一个数据库记录集和将记录集写入文件. a.输出(Export)输 ...
- Apollo 刨析:Localization
九月 30 2014 11:27 上午 admin 0 Comments 今天我们来看一看Apollo中的Localization Component. 本地化在Apollo中的使用 像这样的 ...
- Android中TextView和EditView经常使用属性设置
Android开发中最经常使用的几乎相同就是TextView和EditView了,在使用它时.我们也会设置它的一些属性,为了让我们设计的更好看,设置的更合理.这里记下它的经常使用属性,方便后期查阅. ...
- Ideal-image-slider 幻灯片实例演示
链接:http://zaixianshouce.iteye.com/blog/2316300 http://www.shouce.ren/study/api/s/jq--5733e32bf23bb-- ...
- Python 构造函数、 Python 析构函数、Python 垃圾回收机制
构造函数与析构函数 构造函数: 用于初始化类的内容部状态,Python提供的构造函数式 __init__(); 也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这个函数里 ...
- DefaultActionInvocation类的执行action
DefaultActionInvocation类的执行action 上一章里面有提到过DefaultActionInvocation类的invoke方法里面的invokeActionOnly方法.没有 ...
- 总结OpenvSwitch的调试经验
相信相信不少人在开始用OpenvSwitch(以下简称OVS)或者修改源码的时候,都不知道如何去调试,根据我的学习历程以及从网上搜集的资料做一个汇总. 一. 个人经验 从网上找相关资料,熟悉Openv ...
- 【BZOJ3996】[TJOI2015]线性代数 最大权闭合图
[BZOJ3996][TJOI2015]线性代数 Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的 ...