1. python程序结构
python的程序结构由函数(function)、模块(module)和包(package)组成。
——模块是一系列函数和类的集合,一个python文件就是一个模块。
——包是一系列模块的集合,一个包含__init__.py文件的文件夹是一个包。就像一个文件夹可以再包含子文件夹,一个包也可以再包含子包。
例如,我们可以定义一个这样的包:
package1/
__init__.py
subPack1/
__init__.py
module_11.py
module_12.py
module_13.py
subPack2/
__init__.py
module_21.py
module_22.py
2. __init__.py文件
__init__.py文件定义了包的属性和方法,通过这些属性和方法控制着包的导入行为,它的内容可以为空。
2.1 假如__init__.py的内容为空,那么仅仅导入包是什么都做不了的。
>>> import package1
>>> package1.subPack1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'subPack1'
我们需要在package1/__init__.py里把subPack1预先导入:
#文件package1/__init__.py
import subPack1
现在可以在使用subPack1了:
>>> import package1
>>> package1.subPack1
<module 'package1.subPack1' from 'package1/subPack1/__init__.py'>
2.2 __init__.py 中还有一个重要的属性,叫做 __all__。
有时,我们会在import语句中使用通配符*,导入某个package中的所有元素,这就是通过__all__实现的,它定义了当使用*导入时,有哪些元素会被导入。
例如,我们在subPack1/__init__.py中写入:
__all__ = [“module_12”, “module_13”]
然后尝试使用subPack1中的module:
>>> from package1.subPack1 import *
>>> package1.subPack1.module_11
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'module_11'
>>> package1.subPack1.module_12
<module 'package1.subPack1.module_12' from 'package1/subPack1/module_12.py'>
>>> package1.subPack1.module_13
<module 'package1.subPack1.module_13' from 'package1/subPack1/module_13.py'>
3. 模块的导入
1. import module_name
2. from module_name import func_name
3. from module_name import *
import语句可以多次使用,即使导入的是同一个模块
import语句可以置于文件的任意位置,甚至可以在条件语句中:
if a > 0 :
import module_name
4. 模块的内置属性
__name__:判断当前模块是否是程序的入口——1)如果模块是被导入,__name__的值为模块名,2)如果模块是被执行,__name__的值的为"__main__"。
__file__:用来获得模块所在的路径——1)如果程序以相对路径执行,__file__的值为相对路径,2)如果以绝对路径执行,__file__的值为绝对路径。
__doc__:文档字符串