对于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);


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...