包:直观感觉就是一个文件夹,文件夹的名称就是包名。但是为了区别普通文件夹,python包下需要有一个__init__.py
模块。但是__init__.py
的模块名不是__init__
而是其所在的包的包名
。包下还可以有子包
模块:最直观的感受就是 一个xxx.py文件,其中文件名就是模块的名称。模块下一般是类
在Java编程中,一般建议一个xxx.java只写一个类(内部类的话,不考虑)。并且使用public 关键词修饰的 类名应该和文件名相同。因为python 中的py文件不仅仅是一个源码文件,它有更高的抽象概念即模块,用于组织类。
import module1 [as alias] [, module2[,... moduleN] #只能导入模块,当模块名比较长时,可以使用as定义别名
跟Java不同的是,即便导入了模块但是还是需要使用全名访问。
import datetime
print(datetime.datetime.now())
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。python的搜索路径保存在sys.path
中
>>>import sys
>>>sys.path
>>>['', 'D:\\software\\python\\python36.zip', 'D:\\software\\python\\DLLs', 'D:\\software\\python\\lib', 'D:\\software\\python', 'D:\\software\\python\\lib\\site-packages', 'D:\\software\\python\\lib\\site-packages\\win32', 'D:\\software\\python\\lib\\site-packages\\win32\\lib', 'D:\\software\\python\\lib\\site-packages\\Pythonwin']
sys.path 输出是一个列表,其中第一项是空串”,代表当前目录。
from moduleName import (variable | function | class | module)
from scrapy import * #导入scrapy包下的所有模块
__all__ =[] #使用__all__ 可以定制import * 的导入行为,如果写在__init__.py文件中控制导入模块。如果写在其他模块中,控制导入的函数,类,变量等
如果需要控制导入的行为,只导入部分模块。可以在__init__
文件中添加__all__
属性
__init__.py
-------------------------------------------
__all__ = ['xx','xxx']
说明:
__init__
中的操作之后还会执行被导入模块的代码。 包和模块不会被重复导入__name__
属性,当其值是'__main__'
时,表明该模块自身在运行,否则是被引入。模块被导入以后会执行模块里的语句,如果被导入时不想让其执行,则使用if __name__ == '__main__':
包裹__init__.py
一般 用于批量导入和初始化操作。AttributeError
。目录结构:
- test
- __init__.py
- test.py
- test2.py
_ init _.py
import datetime
print("hello 我是小娜")
test.py
print("*"*30)
test2.py
import test.test
print(datetime.datetime.now())
执行 main.py文件 输出结果:
hello 我是小娜
******************************
2018-08-10 15:55:37.119815
从上面的例子可以看出,当导入包下的某个模块时,会首先执行包下的__init__.py
模块,然后执行被导入模块的语句。如果该模块还有父包,则先执行父包中的__init__.py
文件。
参考文献:
菜鸟