对于Python中装饰器的理解以及在aardio中的实现

By jerryxjr1220 at 2021-09-09 • 0人收藏 • 349人看过

在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);


登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...