python系列教程25

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

 

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好的理解人工智能技术,我让助理负责分享这套python系列教程,希望能帮到大家!

 

模块导入和重载

 

到现在为止,已经讲到了“导入模块”,而实际上没有介绍这个名词的意义。我们将会在后面深入学习模块和较大的程序架构,但是由于导入同时也是一种启动程序的方法,为了能够入门,这里将会介绍一些模块的基础知识。

 

用简单的术语来讲,每一个以扩展名py结尾的Python源代码文件都是一个模块。其他的文件可以通过导入一个模块读取这个模块的内容。导入从本质上来讲,就是载入另一个文件,并能够读取那个文件的内容。一个模块的内容通过这样的属性能够被外部世界使用。

 

这种基于模块的方式使模块变成了Python程序架构的一个核心概念。更大的程序往往以多个模块文件的形式出现,并且导入了其他模块文件的工具。其中的一个模块文件设计成主文件,或叫做顶层文件(就是那个启动后能够运行整个程序的文件)。

 

我们将会对这样的架构问题有更深入的探索。当前最关心的是被载入的文件通过导入操作最终可运行代码。正是如此,导入文件是另一种运行文件的方法。

 

例如,如果开始一个交互对话(从系统命令行、从开始菜单或者在IDLE中),你可以运行之前创建的文件script1.py,通过简单的import来实现(确保删除了在之前添加的input行,或者你无缘无故地需要按Enter键)。

C:\misc> c:\python30\python

>>> import script1

win32

1267650600228229401496703205376
Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

 

这可以运行,但是在默认情况下,只是在每次会话的第一次运行(真的,不信你可以试一下)。在第一次导入之后,其他的导入都不会再工作,甚至在另一个窗口中改变并保存了模块的源代码文件也不行。

>>> import script1

>>> import script1

这是有意设计的结果。导入是一个开销很大的操作,以至于每个文件、每个程序运行不能够重复多于一次。当你学习后面文章时会了解,导入必须找到文件,将其编译成字节码,并且运行代码。

 

但是如果真的想要Python在同一次会话中再次运行文件(不停止和重新启动会话),需要调用imp标准库模块中可用的reload函数(这个函数也是一个Python 2.6内置函数,但在Python 3.0中不是内置的)。

>>> from imp import reload  # Must load from module in 3.0

>>> reload(script1)

win32

65536

Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

>>>

这里的from语句直接从一个模块中复制出一个名字(稍后更详细地介绍)。reload函数载入并运行了文件最新版本的代码,如果已经在另一个窗口中修改并保存了它,那将反映出修改变化。

 

这允许你在当前交互会话的过程中编辑并改进代码。例如,这次会话中,在第一个import和reload调用这段时间里,在script1.py中的第二个打印语句在另一个窗口中改成了2**16。

 

reload函数希望获得的参数是一个已经加载了的模块对象的名称,所以如果在重载之前,请确保已经成功地导入了这个模块。值得注意的是,reload函数在模块对象的名称前还需要括号,import则不需要。reload是一个被调用的函数,而import是一个语句。

 

这也就是为什么你必须把模块名称传递给reload函数作为括号中的参数,并且这也是在重载时得到了额外的一行输出的原因。最后一行输出是reload调用后的返回值的打印显示,reload函数的返回值是一个Python模块对象。

 

注意:版本差异提示:Python 3.0把reload内置函数移到了imp标准库模块中。它仍然像以前一样重载文件,但是,必须导入它才能使用。在Python 3.0中,运行import imp并使用imp.reload(M),或者像这里所示的,运行from imp import并使用reload(M)。

 

如果你在使用Python 2.6(或者是更常见的2.X),reload可以作为内置函数使用,因此,不需要导入。在Python 2.6中,reload可以以两种形式使用,内置函数或者模块函数,这有助于向Python 3.0的转换。换句话说,在Python 3.0中仍然可以使用重载,但是需要一行额外的代码来导入对reload的调用。

 

向Python 3.0迁移,可能部分动机是由一些众所周知的问题所引起的,这些问题包括我们将在后面讨论的reload和from语句。简而言之,用一个from载入的名字不会通过一个reload直接更新,但是,用一条import语句访问的名字则会。如果你的名字似乎不会在一次重载后改变,尝试使用import和module.attribute名称引用。

你可能感兴趣的:(编程技术,python,人工智能)