初学python(对比java语言不同) 第八篇

版权声明: https://blog.csdn.net/xclltssun/article/details/51135586

Java程序中每实现一个概念都必须实现在类内,为了更好地组织类,提供了包机制,用于区别类名的命名空间。


Python 模块

如果你想要编写一些更大的程序,最好使用文本编辑器先编写好,然后运行这个文件。这就是所谓的创建脚本。随着你的程序变得越来越长,你可能想要将它分成几个文件,这样更易于维护。Python有种方法可以把你定义的内容放到一个文件中,然后在脚本或者交互方式中使用。这种文件称为模块;模块中的定义可以导入到其它模块或主模块中。


模块可以包含可执行语句以及函数的定义。这些语句通常用于初始化模块。它们只在第一次导入时执行。
每个模块都有自己的私有符号表,模块内定义的所有函数用其作为全局符号表。因此,模块的作者可以在模块里使用全局变量,而不用担心与某个用户的全局变量有冲突。另一方面,如果你知道自己在做什么,你可以使用引用模块函数的表示法访问模块的全局变量,modname.itemname。
模块中可以导入其它模块。习惯上将所有的 import 语句放在模块(或者脚本)的开始,但这不是强制性的。被导入的模块的名字放在导入模块的全局符号表中。
import 语句的一个变体直接从被导入的模块中导入名字到导入模块的符号表中。例如:

>>> from fibo import fib, fib2
还有种方式可以导入模块中定义的所有名字:

>>> from fibo import *
这种方式不会导入以下划线 (_) 开头的名称。
注意一般情况下不赞成从一个模块或包中导入 * ,因为这通常会导致代码很难读。不过,在交互式会话中这样用是可以的,它可以让你少敲一些代码。
出于性能考虑,每个模块在每个解释器会话中只导入一遍。因此,如果你修改了你的模块,你必需重新启动解释器 —— 或者,如果你就是想交互式的测试这么一个模块,可以使用reload(),例如reload(modulename)。


Python执行模块

当你用下面的方式运行一个Python模块
python fibo.py <arguments>
模块中的代码将会被执行,就像导入它一样,不过此时 __name__ 被设置为 "__main__" 。也就是说,如果你在模块后加入如下代码:

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
就可以让此文件既可以作为可执行的脚本,也可以当作可以导入的模块,因为解析命令行的那部分代码只有在模块作为 “main” 文件执行时才被调用。


模块搜索路径
当导入一个名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会接着到sys.path变量给出的目录中查找名为spam.py的文件。sys.path变量的初始值来自这些位置:
1 脚本所在的目录(或当前目录)。
2 PYTHONPATH (一个包含目录名的列表,与 shell 变量PATH 的语法相同)。
3 与安装相关的默认值。
初始化后,Python程序可以修改sys.path。脚本所在的目录被放置在搜索路径的最开始,也就是在标准库的路径之前。这意味着将会加载当前目录中的脚本,库目录中具有相同名称的模块不会被加载。除非你是有意想替换标准库,否则这应该被当成是一个错误。


Java文件结尾为.java 编译后的文件结尾.class

Python文件结尾为.py 编译后的文件结尾.pyc或者.pyo

在没有相同的模块文件spam.py时,使用文件spam.pyc (或spam.pyo时使用-O )。这可用于发布不太容易进行反向工程的Python 代码库。


Python 带有一个标准模块库,并发布有单独的文档叫Python 库参考手册(以下简称"库参考手册")。有些模块被直接构建在解析器里;这些操作虽然不是语言核心的部分,但是依然被内建进来,一方面是效率的原因,另一方面是为了提供访问操作系统原语,如系统调用的功能。这些模块是可配置的,也取决于底层的平台。例如,winreg模块只在Windows系统上提供。有一个特别的模块值得注意:sys,它内置在每一个Python解析器中。


Python 包

包是一种管理Python模块命名空间的方式,采用“点分模块名称”。为了让Python将目录当做包,目录下必须包含 __init__.py 文件


注意使用from package import item时,item 可以是包的子模块(或子包),也可以是包中定义的一些其它的名称,比如函数、 类或者变量。import语句首先测试 item 在包中是否有定义;如果没有,它假定它是一个模块,并尝试加载它。如果未能找到,则引发ImportError异常。
相反,使用类似 import item.subitem.subsubitem 这样的语法时,除了最后一项其它每项必须是一个包;最后一项可以是一个模块或一个包,但不能是在前一个项目中定义的类、函数或变量。


那么现在如果用户写成 from sound.effects import * 会发生什么?理想情况下,他应该是希望到文件系统中寻找包里面有哪些子模块,并把它们全部导入进来。这可能需要很长时间,而且导入子模块可能会产生想不到的副作用,这些作用本应该只有当子模块是显式导入时才会发生。
唯一的解决办法是包的作者为包提供显式的索引。import 语句使用以下约定: 如果包中的 __init__.py 代码定义了一个名为__all__的列表,那么在遇到 from package import *语句的时候,应该把这个列表中的所有模块名字导入。当包有新版本包发布时,就需要包的作者更新这个列表了。如果包的作者认为不可以用 import * 方式导入它们的包,也可以决定不支持它。


猜你喜欢

转载自blog.csdn.net/xclltssun/article/details/51135586
今日推荐