python装饰器1

简单介绍装饰器(注意格式)

高阶函数:至少满足下面两个条件中的一个
1:接受一个或多个函数为参数
2:输出一个函数
柯里化:将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原来第二个参数为参数的函数。z=f(x,y)—>z=f(x)(y)

装饰器(无参)
1:是一个函数
2:函数作为它的形参
3:返回值也是一个函数
4:可以使用@functionname方式调用
装饰器是对传入函数的功能的装饰(功能增强)

装饰器的基本形式:
def logger(fn):
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warp
@logger
def add(x,y):
return x+y
logger函数为装饰器函数,对add函数进行功能性的增强。
@functionname下紧跟着的为被装饰的函数。

装饰器会替换掉原函数对象的属性,需要使用一个functools模块进行保护。
用上面的例子
from functools import wraps

def logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warpper
@logger
def add(x,y):
return x+y

带参装饰器:
1:是一个函数
2:函数作为它的形参
3:返回值是一个不带参的装饰器函数
4:使用@functionname(参数列表)方式调用
5:可以看做在装饰器外层又加了一层函数

from functools import wraps

def logger(f):
def _logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warpper
return _logger
@logger
def add(x,y):
return x+y
装饰器的用途:
装饰器是AOP(Aspect Orientend Programming)面向切面编程的思想体现。
面向对象往往需要通过继承或者组合依赖等方式调用一些功能,这些功能的代码往往可能在多个类中出现,例如logger,这样造成代码的重复,增加了耦合。logger的改变影响所有使用它的类或方法。而AOP在需要的类或方法上切下,前后的切入点可以加入增强的功能。让调用者和被调用者解耦。这是一种不修改原来的业务代码,给程序动态添加功能的技术。例如logger函数功能就是对业务函数增加日志的,而业务函数中应该把与业务无关的日志功能剥离干净。
装饰器的应用场景:
日志、监控、权限、设计、参数检查、路由等处理。
这些功能与业务功能无关,很多业务都需的公共功能,适合独立出来,需要时对目标对象增强。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88007

(0)
上一篇 2017-10-22 19:51
下一篇 2017-10-23 08:54

相关推荐

  • 马哥教育网络第21期-第十一周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 A和B进行通信 A发送数据:A使用单向加密算法获得数据的特征码,把特征码附加到数据的尾部,A使用对称加密算法对数据进行加密。A使用B发过来的公钥对A的对称加 密算法加密密钥进行加密,附加到数据后面。 B接收方:B使用自己的私钥对数据进行解密。得到A的对称密钥,对对称密钥解密获得数据的特征码,B使用单向加密算法获…

    Linux干货 2016-12-26
  • shell脚本之变量类型、算数运算符、条件测试

    一、bash中的变量类型     本地变量:仅对当前shell有效,对其子shell无效             变量赋值:name=value      &n…

    Linux干货 2016-08-15
  • 内核编译安装 (用NTFS模块)

    内核编译安装 (用NTFS模块) 1 rz 下载的 的内核最新文件 在这 https://www.kernel.org/ 2 tar xvf linux-4.12.10.tar.xz 解压文件 内核文件一般都放在 /usr/src/ 3 cd linux-4.12.10/ 4 [root@god linux-4.12.10]#cp /boot/config-…

    2017-09-04
  • iptables学习笔记   Netfilter:是Linux操作系统核心层内部的一个数据包处理模块。   Hook point:数据包在Netfilter中的挂载点。(PRE_ROUTIN   ,INPUT,OUTPUT,FORWARD,POST_ROUTING)   iptables 规则组成:四张表+五条链(Ho…

    Linux干货 2016-12-05
  • Linux的终端类型

            Linux的终端类型         Linux终端的定义         Linux终端的分类 &nb…

    Linux干货 2016-10-18
  • mysql基础篇(一些基本概念的总结)

    一、安装以及初始化     软件包来源         1. vendor, rpm           2. 官网,source code 编译 &…

    Linux干货 2015-12-03