对于Python中装饰器的理解以及在aardio中的实现
By
jerryxjr1220
at 2021-09-09 • 0人收藏 • 728人看过
在Python代码中经常能见到
@some_other_function def func(*args,**kwargs): ...
这样的写法。
@some_other_function这种在Python中就称作装饰器。
下面是我对装饰器的理解:
先来看一个原始程序,非常简单就是直接打印后面的不定参数。在Python中用*args和**kwargs表示。
def func(*args,**kwargs): print(*args, **kwargs)
如果我们要在不改变原有函数的基础上,增加额外功能该怎么做呢?
def some_other_function(*args,**kwargs): print("Do something else...") func(*args,**kwargs)
似乎也能执行,但是这里会遇到一个问题,就是我们调用的时候更改了函数名称,从原来的func变成了some_other_function,这种在非常庞大的软件项目里也是不能接受的,会引起非常大的修改量。而如果强行修改程序名称,又会在调用时陷入死循环,如
func = some_other_function
然后,就引出了闭包的概念。我们可以在函数中加入一个内层函数,在内层函数中执行原有程序,就像这样
def some_other_function(func): def inner(*args,**kwargs): func(*args,**kwargs) print("Do something else...") return inner
然后这样就不会陷入死循环
func = some_other_function(func)
这句的写法,在Python中就是前文提到的装饰器的语法糖的写法
@some_other_function def func(*args,**kwargs): print(*args, **kwargs)
调用的时候直接
func("Initial Program...")
同样的,在aardio中也可以实现一样的功能
import console; console.open(); //原始程序 func = function(...){ console.log(...) } //装饰器程序 dosomething = function(func){ var inner = function(...){ func(...); console.log("Do something else...") } return inner; } //装饰器加载到原始程序上 func = dosomething(func); //原始程序调用 func("Initial Program...") console.pause(true);
登录后方可回帖