我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串:
# requirements.py def 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.py hello world! !dlrow olleh hello again! !niaga olleh
在两个函数中都使用到了同样的打印功能,这时候我们可以考虑,是不是可以将这两个打印语句封装为一个函数呢,这样不就可以重复利用了?这就是模块化编程思维的雏形,让我们先对样例代码进行模块化的改造:
# requirements.py def 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.py hello world! !dlrow olleh hello again! !niaga olleh
结果当然还是与模块化之前一致的。
在上一章节中,我们讨论了python中的模块化编程。由于在编程过程中有可能有大量的代码需要复用,这时候就需要用一个函数来进行封装,来避免大量重复的工作。但是如果细分来看,这种封装模式只解决了一类的问题:向下封装。让我们再看一次上述改进后样例中的代码结构:
. ├── example1 │ └── rprint └── example2 └── rprint
我们可以发现,这里复用的rprint实际上属于两个example函数的下层,我们可以称之为向下封装了一个rprint函数。那么,如果我们转换一下需要复用的模块,变成如下的代码结构,那我们又需要用什么样的方式来实现呢?
. ├── example │ └── rprint1 └── example └── rprint2
问题解读:该代码结构表示的意义为,有一个大的example函数,该函数内部嵌套不同的rprint函数可以实现不同的功能。为了方便理解,读者可以想象成是有两个函数example1和example2,这两个函数中除了rprint1和rprint2这两个函数模块不一致以外,其他的部分都是完全一样的,也就是可共用的。
首先,我们为了复盘上述章节中的问题,来构造这样的一个python测试代码:
# requirements.py def 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.py hello world! !dlrow olleh
这个案例用到了python中嵌套函数的用法,在函数中可以嵌套实现另外的函数。这里我们注意到,虽然为了在同一个代码串中嫩够运行,两个example函数的名字取的不同,但是实际上内容是完全相同的,符合上一章节中遗留问题的代码结构。这里我们需要考虑的问题是,我们能否做到向上封装,将example的同样功能的代码实现进行归类?那么我们需要引入装饰器的用法,这里我们直接展示如何构造修饰器,以及修饰器使用的效果。
# decorator.py def example(func): def wrapper(*args, **kwargs): a = 'hello world!' return func(a) return wrapper @example def rprint1(para): print (para) @example def rprint2(para): print (para[::-1]) if __name__ == '__main__': rprint1() rprint2()
这个代码的执行结果为:
[dechin@dechin-manjaro decorator]$ python3 decorator.py hello world! !dlrow olleh
从结果上我们就可以看到,这个代码是实现了一样的效果。通过example这个装饰器,不仅封装了上层函数中所实现的功能,而且还有一个重大意义是,通过装饰器向下层函数传递了参数。这就使得,我们最终调用rprint函数的时候,不需要传入任何的参数,因为在example内已经定义了可以共享的参数。
Python的装饰器并不是一个非常难以实现的特性,其关键意义在于实现了向上封装的模块化编程。在我们过往的编程实现中,更多的是向下封装常用的、可复用的代码模块。这里通过Python所提供的装饰器特性,我们就可以将函数外部所共享的代码模块也进行封装。因此,由函数和装饰器分别实现的向下封装与向上封装的特性,共同构成了提高编码效率和编码可读性提升的模块化编程模式。
以上就是详解Python模块化编程与装饰器的详细内容,更多关于python 模块化编程与装饰器的资料请关注小牛知识库其它相关文章!
本文向大家介绍Javascript模块化编程详解,包括了Javascript模块化编程详解的使用技巧和注意事项,需要的朋友参考一下 模块化编程是一种非常常见Javascript编程模式。它一般来说可以使得代码更易于理解,但是有许多优秀的实践还没有广为人知。 基础 我们首先简单地概述一下,自从三年前Eric Miraglia(YUI的开发者)第一次发表博客描述模块化模式以来的一些模块化模式。如果你已
本文向大家介绍Python装饰器的函数式编程详解,包括了Python装饰器的函数式编程详解的使用技巧和注意事项,需要的朋友参考一下 Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好像,他们要干的事都很相似——都是想要对一个已有的模块做一些“修饰工作”,所谓修饰工作就
本文向大家介绍实例详解Python装饰器与闭包,包括了实例详解Python装饰器与闭包的使用技巧和注意事项,需要的朋友参考一下 闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数中是能访问全局变量的: 然后,在一个嵌套函数中,内层函数能够访问在外层函数中定义的局部变量: 闭包 上面的嵌套函数就是闭包。 闭包 是指延伸了作用域的函数,在
本文向大家介绍python中的装饰器详解,包括了python中的装饰器详解的使用技巧和注意事项,需要的朋友参考一下 在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 因为在python里面,函数也是对象,也可以作为参数进行传递.python装饰器本质也是一种特殊函数,它接收的参数是函数对象,然后动态地函数参数添加额外的功能,而不用修改原有的函数对象.p
本文向大家介绍Python json模块与jsonpath模块区别详解,包括了Python json模块与jsonpath模块区别详解的使用技巧和注意事项,需要的朋友参考一下 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。 JS
本文向大家介绍python装饰器实例大详解,包括了python装饰器实例大详解的使用技巧和注意事项,需要的朋友参考一下 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域。 全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修