AI智能
改变未来

Python模块化编程与装饰器


Python的模块化编程

我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为

requirements.py

的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串:

# requirements.pydef example1():a = \'hello world!\'print (a)print (a[::-1])def example2():b = \'hello again!\'print (b)print (b[::-1])if __name__ == \'__main__\':example1()example2()

其执行结果如下所示:

[dechin@dechin-manjaro decorator]$ python3 requirements.pyhello world!!dlrow ollehhello again!!niaga olleh

在两个函数中都使用到了同样的打印功能,这时候我们可以考虑,是不是可以将这两个打印语句封装为一个函数呢,这样不就可以重复利用了?这就是模块化编程思维的雏形,让我们先对样例代码进行模块化的改造:

# requirements.pydef rprint(para):print (para)print (para[::-1])def example1():a = \'hello world!\'rprint(a)def example2():b = \'hello again!\'rprint (b)if __name__ == \'__main__\':example1()example2()

这里我们将两个打印语句的功能实现封装进了

rprint

的函数,执行结果如下:

[dechin@dechin-manjaro decorator]$ python3 requirements.pyhello world!!dlrow ollehhello again!!niaga olleh

结果当然还是与模块化之前一致的。

向下封装与向上封装

在上一章节中,我们讨论了python中的模块化编程。由于在编程过程中有可能有大量的代码需要复用,这时候就需要用一个函数来进行封装,来避免大量重复的工作。但是如果细分来看,这种封装模式只解决了一类的问题:向下封装。让我们再看一次上述改进后样例中的代码结构:

.├── example1│   └── rprint└── example2└── rprint

我们可以发现,这里复用的

rprint

实际上属于两个

example

函数的下层,我们可以称之为向下封装了一个

rprint

函数。那么,如果我们转换一下需要复用的模块,变成如下的代码结构,那我们又需要用什么样的方式来实现呢?

.├── example│   └── rprint1└── example└── rprint2

问题解读:该代码结构表示的意义为,有一个大的

example

函数,该函数内部嵌套不同的

rprint

函数可以实现不同的功能。为了方便理解,读者可以想象成是有两个函数

example1

example2

,这两个函数中除了

rprint1

rprint2

这两个函数模块不一致以外,其他的部分都是完全一样的,也就是

可共用的

Python的嵌套函数与装饰器

首先,我们为了复盘上述章节中的问题,来构造这样的一个python测试代码:

# requirements.pydef example1():def rprint1(para):print (para)a = \'hello world!\'rprint1(a)def example2():def rprint2(para):print (para[::-1])a = \'hello world!\'rprint2(a)if __name__ == \'__main__\':example1()example2()

以上代码的执行结果为:

[dechin@dechin-manjaro decorator]$ python3 requirements.pyhello world!!dlrow olleh

这个案例用到了python中嵌套函数的用法,在函数中可以嵌套实现另外的函数。这里我们注意到,虽然为了在同一个代码串中嫩够运行,两个

example

函数的名字取的不同,但是实际上内容是完全相同的,符合上一章节中遗留问题的代码结构。这里我们需要考虑的问题是,我们能否做到向上封装,将

example

的同样功能的代码实现进行归类?那么我们需要引入装饰器的用法,这里我们直接展示如何构造装饰器,以及装饰器使用的效果。

# decorator.pydef example(func):def wrapper(*args, **kwargs):a = \'hello world!\'return func(a)return wrapper@exampledef rprint1(para):print (para)@exampledef rprint2(para):print (para[::-1])if __name__ == \'__main__\':rprint1()rprint2()

这个代码的执行结果为:

[dechin@dechin-manjaro decorator]$ python3 decorator.pyhello world!!dlrow olleh

从结果上我们就可以看到,这个代码是实现了一样的效果。通过

example

这个装饰器,不仅封装了上层函数中所实现的功能,而且还有一个重大意义是,通过装饰器向下层函数传递了参数。这就使得,我们最终调用

rprint

函数的时候,不需要传入任何的参数,因为在

example

内已经定义了可以共享的参数。

关于Python装饰器的总结

Python的装饰器并不是一个非常难以实现的特性,其关键意义在于实现了

向上封装

的模块化编程。在我们过往的编程实现中,更多的是

向下封装

常用的、可复用的代码模块。这里通过Python所提供的装饰器特性,我们就可以将函数外部所共享的代码模块也进行封装。因此,由函数和装饰器分别实现的

向下封装

向上封装

的特性,共同构成了提高编码效率和编码可读性提升的模块化编程模式。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Python模块化编程与装饰器