当需要对已定义的函数进行功能扩展但又不能去改变原有函数时就会用到装饰器。装饰器在python中是非常常用且重要的功能,是一种python的语法糖。
在理解装饰器之前先看下面的加法函数:
def add(x,y):
return x + y
若想增加信息输出功能:
def add(x,y):
prtint("output")
return x + y
这样修改耦合太高,并且侵入了原有的业务代码。我们可以改成这样:
def add(x,y):
return x + y def test(fn):
print('begin') # 增强的输出
print('end') # 增强的功能
return fn print(test(add)(4,5))
使函数test()更便捷的传参:
def add(x,y):
return x + y def test(fn,*args,**kwargs): #相当于是*args,**kwargs作为参数传给fn这一函数对象。
print('begin') # 增强的输出
print('end') # 增强的功能
return fn(*args,**kwargs) # print(test(add,4,23))
对test()函数进行柯里化,让它只接收函数对象:
def test(fn):
def wrapper(*args,**kwargs):
print("hello")
print("world")
return fn(*args,**kwargs)
return wrapper print(test(add)(3,6))
使用装饰器:
def test(fn):
def wrapper(*args,**kwargs):
print("hello")
print("world")
return fn(*args,**kwargs)
return wrapper @test #等价于add = test(add)
def add(x,y):
return x + y @test #用test()函数再对add1()函数进行一次装饰,等价于add1 = test(add1)
def add1(x,y,z):
return x + y + z print(add(x=4,y=6))
print(add1(3,5,43))
可以理解为装饰器是用一个函数将另一个函数装饰了一次,在这里看似调用的是add()和add1()函数,但实际上调用的是test()函数,再由test()函数返回wrapper函数对象将参数传给内部fn()函数,test()函数中的参数是什么,fn()函数就是什么。(装饰器的用@表示。)
柯里化与python装饰器的更多相关文章
-
python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化
函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...
-
Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
-
Python进阶1---高阶函数、柯里化
高阶函数 不相等 自定义sort函数 内建函数--高阶函数 #sort函数 def sort2(lst,key = None,reverse = False): res = [] if key is ...
-
从0开始的Python学习007函数&;函数柯里化
简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...
-
python 高阶函数、柯里化
高阶函数 First Class Object 函数在python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量.参数.返回值等等 高阶函数 数学概念 y=g(f(x)) 在数学和计算机 ...
-
python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
-
Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
-
Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
-
Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
-
Could not load file or assembly 'System.Data.SQLite' or one of its dependencies
试图加载格式不正确的程 异常类型 异常消息Could not load file or assembly 'System.Data.SQLite' or one of its dependencies ...
-
解决 CentOS网卡eth0启用不了问题
转自:http://www.centoscn.com/CentosBug/osbug/2014/0423/2850.html [root@localhost Desktop]# service net ...
-
apache-jmeter学习文档
http://www.cnblogs.com/TankXiao/p/4045439.html#sampler
-
MVC 读书笔记
一.路由 1.HttpApplication中的ASP.NET MVC .Net 3.5 引入了System.Web.Routing程序集,通过Url Routing的机制,可以实现将一个虚拟路径的请 ...
-
java自己主动生成验证码
代码结构: web.xml <? xml version="1.0" encoding="UTF-8"?> <web-app version= ...
-
XWalkView+html 开发Android应用
在Android开发中有时候为了开发简洁和方便移植,采用了Html+WebView的开发模式,然而Android自带的WebView控件是调用的本机的浏览器内核,有些版本较老的手机浏览器和手机性能都不 ...
-
openstack之glance基础
第一:glance是什么? glance是Image service的项目代号,是Openstack的镜像服务组件,为创建虚拟机提供镜像服务. 第二:glance的功能 Glance主要提供了一个虚拟 ...
-
算数运算符: + - * / //(地板除) %(取余) **(幂运算) / 比较运算符 >; <; >;= <;= == !=
# ### python运算符 #(1) 算数运算符: + - * / //(地板除) %(取余) **(幂运算) var1 = 5 var2 = 8 # +res = var1 + var2 pri ...
-
day02---编程语言、python解释器以及变量
计算机编程语言分类: 机器语言 直接用计算机能理解的二进制指令编写程序,来直接控制硬件.(用机器语言编写的程序称为目标程序) 优点:执行效率高,属于计算机最底层语言 缺点:开发效率低.跨平台性差 汇编 ...
-
python:浅拷贝与深拷贝
1,“相等”与“相同” 我们先赋值三个变量a, b, c: a = [1, 2, [1, 2]] b = [1, 2, [1, 2]] c = a 判断一下‘相等’: a == b 返回 True ...