Decorator - 装饰器
装饰器 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 - 装饰器的更多相关文章
- Python进阶之decorator装饰器
decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析
装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...
- 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)
摘要:首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面共有的东西提炼了出来,也可能我们也会用各种各样的include标签,将我们 ...
- 装饰器模式&&ES7 Decorator 装饰器
装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构.相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活. ...
- 十二、Decorator 装饰器模式
设计: 代码清单: Display public abstract class Display { public abstract int getColumns(); public abstract ...
- 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器
下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...
- Python decorator装饰器
问题: 定义了一个新函数 想在运行时动态增加功能 又不想改动函数本身的代码 通过高阶段函数返回一个新函数 def f1(x): return x*2 def new_fn(f): #装饰器函数 def ...
- Python进阶: Decorator 装饰器你太美
函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message): print('Got a message: {}'.format(message)) send ...
随机推荐
- 简单易学的Linux 命令整理
Linux 是目前应用最广泛的服务器操作系统,基于 Unix,开源免费,由于系统的稳定性和安全性,市场占有率很高,几乎成为程序代码运行的最佳系统环境.linux 不仅可以长时间的运行我们编写的程序代码 ...
- Alibaba Nacos 服务发现组件集群部署
前面学习了单机模式下的启动,生产环境中部署nacos肯定是使用集群模式cluster保证高可用. 官方文档的集群部署推荐使用VIP+域名模式,把所有服务列表放到一个vip下面,然后挂到一个域名下面. ...
- flask模板 flask-bootstrap
1.模板 a.block块中继承前面block块的内容,需要添加{{super()}} b.macro 宏: 作用:在模板中定义函数(定义函数->注意添加()->可以使用from 模板 ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 正斜杠(" / ")和反斜杠(" \ ")的区别
反斜杠“\”是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点.所以除了程序设计领域外,任何地方都不应该使用反斜杠. 如何区分正反斜杠 英语:"/" 英文是forward ...
- 机器学习环境配置系列四之theano
决定撰写机器学习环境配置的主要原因就是因为theano的配置问题,为了能够用上gpu和cudnn加速,我是费劲了力气,因为theano1.0.0在配置方面出现了重大改变,而网上绝大多数都很老,无法解决 ...
- quick-cocos2d-x项目《狂点小怪兽》总结
最近找了个公司实习,领导让我把公司的<狂点小怪兽>C++游戏用Lua重写.大概用了一个星期完成. 第一次使用quick-cocos2d-x,磕磕碰碰的也算是走了一遍流程. 1. quick ...
- SpringBoot简单实现登录功能
登陆 开发期间模板引擎页面修改以后,要实时生效 1).禁用模板引擎的缓存 # 禁用缓存 spring.thymeleaf.cache=false 2).页面修改完成以后ctrl+f9:重新编译: 登陆 ...
- C#的WinForm窗体美化
为了帮助用户追求美观,.NET 4.0 专门为对此有需求的人提供了IrisSkin4.dll皮肤引用集,里面封装了许多对窗体重新描绘的方法,再搭配上WinForm特有的 .ssk 文件,就可以实现窗体 ...
- Nginx搭建过程
https://www.cnblogs.com/gscq073240/articles/6773000.html