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 ...
随机推荐
- Redis系列之----Redis的两种持久化机制(RDB和AOF)
Redis的两种持久化机制(RDB和AOF) 什么是持久化 Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望 ...
- css3实现左右div高度自适应且内容居中对齐
主要运用了css3的弹层布局,直接上代码: 效果:左边盒子宽度固定.内容居中对齐.与右侧盒子高度相等,右侧自动缩放 html: <div class="main"> & ...
- Pycharm 中的翻译工具
对于开发来说,大多数哥们英文欠缺,比如在下,我们大多数使用的开发工具是IDEA,IDEA 很强大,开发起来顺手. 废话不多说,让我们看一下如何使用翻译器. 打开Pycharm 的setting 设置, ...
- 安装mysql8.0.17指南
1.首先,下载社区版mysql(下载地址https://dev.mysql.com/downloads/mysql/) 2.下载之后,将文件解压到自己想要安装的目录(如,本人将解压文件放置g://my ...
- arima.predict()参数选择以及相关的一些问题
在使用a ri ma进行模型建立时,需要注意以下几点 1.参数选择上predict必须起始时间在原始的数据及当中的,在下例中就是说2017必须在数据集里面,而2019不受限制,只哟在2017后面就好了 ...
- 关于neo4j初入门(5)
neo4j和Java Neo4j提供JAVA API以编程方式执行所有数据库操作. 它支持两种类型的API: Neo4j的原生的Java API Neo4j Cypher Java API Neo4j ...
- IDEA使用 磨刀霍霍向代码
工欲善其事,必先利其器 ,当下有数不清的 Java 程序员将石器时代的 Eclipse 替换成了现代化的智能开发工具 InteliJ IDEA ,写代码的小日子过得不亦乐乎(玩笑话,两者各有千秋,看个 ...
- Entity Framework 6+ 连接Mysql
好吧.这个博客开不开的 我感觉.. 都一样了. 前言: 公司改造Sqlserver ->Mysql Sql2016老夫对不住你啊.. 好 前沿结束. 需要的家伙: 1.mysql-for-vis ...
- Python+Excel 操作对比
前言 从网页爬下来的大量数据需要excel清洗成堆的科学实验数据需要导入excel进行分析作为一名面向逼格的Python程序员该如何合理而又优雅的选择生产力工具呢? 得益于辛勤劳作的python大神们 ...
- 团队项目—Beta版本冲刺3
博客介绍 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业要求在哪里 https://w ...