装饰源码
⑴ python中支持参数的装饰器要比无参数的多一层什么函数
1. 函数带多个参数
# 普通的装饰器, 打印函数的运行时间
def decrator(func):
def wrap(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print('运行时间为', end_time-start_time)
return res
return wrap
2. 装饰器带有多个参数
当装饰器带有多个参数的时候, 装饰器函数就需要多加一层嵌套:
比如:
def decrator(*dargs, **dkargs):
def wrapper(func):
def _wrapper(*args, **kargs):
print ("装饰器参数:", dargs, dkargs)
print ("函数参数:", args, kargs)
return func(*args, **kargs)
return _wrapper
return wrapper
为什么被装饰函数体可以传入内层呢?
装饰器函数有多个参数, 需要以
@decrator(1, a=2)
的方式使用, 这时候decrator是已经执行的(因为加了括号), 可以粗略的理解为加载被装饰函数的上的是wrapper, 所以这和普通的装饰器并无差别.
又如flask源码中的:
def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
flask的蓝图route源码中的装饰器, 最内层直接返回return f 并没有多加一层处理的函数, 在无需对被装饰函数进行过多处理的时候这是较为方便的做法. route源码中只是对装饰器参数进行了处理.
⑵ Python之装饰器简介
python函数式编程之装饰器
1.开放封闭原则
简单来说,就是对扩展开放,对修改封闭。
在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。
此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。
相关推荐:《Python视频教程》
2.什么是装饰器??
装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。
所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。
3.装饰器的作用
在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。
原则:
1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式
目标:
为被装饰对象添加新功能。
⑶ 一文说透JS装饰器
装饰器是什么?
装饰器(Decorator)是ES7中的一个提案,预计未来成为规范。广泛应用于面向对象编程语言,如Java、Python等。
装饰器是与类相关的语法,主要功能在于注释或修改类及其方法。面向对象语言普遍支持此功能。
装饰器的作用?
装饰器像其名“装饰器”,可对对象进行装饰后返回包装对象。装饰对象包括类、类方法和访问器。
实例演示装饰器的作用。
在Hero类中添加speak装饰器,该装饰器在类原型上添加name属性。实例化Hero类时,实例自动拥有name属性。
通过参数调整speak装饰器,使其更灵活。装饰器可接受参数,并将参数作为name属性值。
装饰器支持传参与不传参。
装饰类属性(类方法)
为Hero类的speak方法添加readOnly装饰器,修改实例化后的speak方法将引发错误。
注意,装饰器仅支持装饰类属性中的类方法,无法装饰类属性。
参数详解
每个装饰器有三个参数:target、name和descriptor。
在装饰类时,target是类本身,此时name和descriptor为undefined。
在装饰类方法时,target是类实例,name是方法名称,descriptor是方法描述对象,包含value和其他控制值行为的属性。
装饰器的实现原理
通过Babel编译为ES5后的源码分析。
理解decorators数组中函数如何映射到Object.defineProperty操作对象的属性。
分析readOnly装饰器如何修改属性的可写入性。
说明装饰器支持多个方法作用于同一属性。
装饰器的使用场景
装饰器使代码更优雅、抽象,以React为例。
通过装饰器,实现“方法调用时需打印日志”功能。
小结
本文概述了装饰器原理、作用及应用场景。装饰器可提供实用且便利的编码功能。
期待装饰器规范定案后,带来更好的使用体验和抽象实践。