18910140161

Python的装饰器和语法糖

顺晟科技

2021-06-16 10:45:09

248

我们写代码的时候,经常会遇到这样的问题。有几种不同的功能,我们希望它们都执行一些共同的功能,然后各自执行不同的功能。比如我们写神经网络的时候,定义了很多种层,然后希望在建网络的时候输出每一层的名字。这个功能怎么实现?

方法1:

def conv(.):

印刷(《conv》)

.

def fc(.):

打印(' fc ')

.

.

这样在调用的时候会依次输出图层名称,但是这样真的很费时费力。每个print()都需要手动输入。有什么简单的方法吗?

方法2:

def print_info(layer,*args,**kwargs):

打印(层。__name__)

层(.)

def fc(.):

.

def conv(.):

.

.

调用时,使用print_info(图层)代替,如调用卷积图层时使用print_info(conv)。然而,这种方法有明显的缺点。首先,每次调用prin_info函数和传递参数都很麻烦。其次,破坏了原有的代码逻辑。

方法3:

def打印信息(层):

def get_layer(*args,**kwargs):

打印(层。__name__)

层(.)

返回get_layer

def fc(.):

.

def conv(.):

.

调用时,使用func=print _ info(func);Func(…)代替,如调用卷积层时conv=print _ info(conv);conv(……).这里print_info()是一个简单的decorator,它包装了真正的核心get_layer()函数。这种方法更大的优点是,它可以在不改变原始代码的情况下给函数添加额外的函数。但是我们还是不满意。以后叠层的时候每次都要做作业吗?当然不是。

方法4:

def打印信息(层):

def get_layer(*args,**kwargs):

打印(层。__name__)

层(.)

返回get_layer

@print_info

def fc(.):

.

@print_info

def conv(.):

.

现在可以像以前一样直接叫conv,fc(),相当于写方法3。这就是我们所说的语法糖,让原本苦涩的代码结构变得甜蜜。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航