装饰器 Decorator,

先来看看对 decorator 这个名词的解释,
一个可调用的对象 A (decorator), 返回另一个可调用的对象 B, 在可调用的对象 C 的定义体之前通过语法 @A 调用.
Python 的解释器会调用 A(C), 把 C 的定义提替换成 B 并返回(return).
如果可调用对象 C 是函数, 那么将 A 称作 '函数装饰器(function decorator)'; 若 C 是类,则称 A 为 '类装饰器(class decorator)'.
decorator 的作用是对目标对象 C 进行'加工处理'(可以理解为对对象 C '增','删','改','查'等), 并返回处理处理后的新对象. 通过例子说明,
装饰器 decorator 是可以调用的对象, 其参数是另一个被装饰对象 object (class or function).
装饰器 可能会'加工'被装饰的对象, 然后把它返回, 又或者将其替换成另一个可以调用对象返回. 函数装饰器例子(function decorator),
def A(a,b):
print(a+b)
函数 A 直接打印 两个入参的和, 现在有这样一个需求,再打印结果(和)之前, 提示:'Start calculating the sum of a and b ...',
来看看这个需求如何通过 decorator 来实现.
def C(A): #1 传入 被调用对象
def innerC(a,b): #2 加工函数, 对被装饰对象 A 进行加工处理, 参数与目标对象 A 保持一直
print('Start calculating the sum of %d and %d' % (a,b)) #3 '需求' 的实现
return A(a,b) #4 将被装饰函数的调用返回,保证'闭环', 返回的是 对象 A 的 return 的对象(非必选的 return)
return innerC #5 将包装对象 A 的 函数返回(必选的return, 保证对对象 A 装饰后得到新对象是可调用的) @C #6 装饰器语法
def A(a,b):
print(a + b) A(1,3) Output,
Start calculating the sum of 1 and 3 ... #3
4 类装饰器例子(class decorator),
同样地, 计算 a, b 的和, 用类来实现, 并将 decorator C 应用到这个类上, 看看输出结果如何,
@C
class A(object):
def __init__(self,a,b):
print(a + b) Output,
Start calculating the sum of 3 and 5 ...
8
<__main__.A object at 0x038234D0>
# 同样, 通过 class decorator C 满足了在计算之前打印提示:'Start calculating the sum of a and b ...' 的需求. 注, 装饰器的一个关键特性是, 它们在被装饰的函数定义之后立即运行。通常是在导入时。
实际的情况是, 更多的时候装饰器函数通常在一个模块中被定义, 然后被应用到其他模块儿中的对象上.

Decorator - 装饰器的更多相关文章

  1. Python进阶之decorator装饰器

    decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  2. 谈谈Python中的decorator装饰器,如何更优雅的重用代码

    众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...

  3. Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析

    装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...

  4. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

    摘要:首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面共有的东西提炼了出来,也可能我们也会用各种各样的include标签,将我们 ...

  5. 装饰器模式&&ES7 Decorator 装饰器

    装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构.相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活. ...

  6. 十二、Decorator 装饰器模式

    设计: 代码清单: Display public abstract class Display { public abstract int getColumns(); public abstract ...

  7. 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器

    下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...

  8. Python decorator装饰器

    问题: 定义了一个新函数 想在运行时动态增加功能 又不想改动函数本身的代码 通过高阶段函数返回一个新函数 def f1(x): return x*2 def new_fn(f): #装饰器函数 def ...

  9. Python进阶: Decorator 装饰器你太美

    函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message): print('Got a message: {}'.format(message)) send ...

随机推荐

  1. JAVA封装、继承、多态

    封装 1.概念: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: a.只能通过规定的方法访问数据 b.隐藏类的实例细节,方便修改和实 ...

  2. 一次asp.net core3.1打造webapi开发框架的实践

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAigAAAAbCAYAAABWfHSvAAAH30lEQVR4nO1dy5GsMAx80RIESRAEST ...

  3. 小程序的<label>标签

    用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...

  4. 两个大数相乘 - 高精度FFT

    HDU 1402 A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. 幽灵java进程引起的: FATAL ERROR in native method

    FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT( ...

  6. Java入门 - 语言基础 - 06.变量类型

    原文地址:http://www.work100.net/training/java-variable-type.html 更多教程:光束云 - 免费课程 变量类型 序号 文内章节 视频 1 概述 2 ...

  7. synchronized的使用

    概念: 是利用锁的机制来实现同步的. 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操 ...

  8. 调用Excel.Application报错的解决方法

    之前由于装了WPS后,VBA和python调用某些OFFICE的端口一直报错.网上找了无数的解决办法.也没有解决. 将注册表清理.不行. 将WPS卸载.不行. 将office重装.不行. 之后找到了个 ...

  9. 谈谈 InnoDB引擎中的一些索引策略

    如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...

  10. 04--Java--使用eclipse创建开发java项目步骤

    eclipse创建开发java步骤 1.三种创建java项目 1)方式一:在包资源管理器(package explorer)窗口中鼠标右击任意位置选择New --> Java Project,如 ...