python随笔(包和模块)

包和模块

python 组织结构
  • 包:直观感觉就是一个文件夹,文件夹的名称就是包名。但是为了区别普通文件夹,python包下需要有一个__init__.py模块。但是__init__.py的模块名不是__init__而是其所在的包的包名。包下还可以有子包

  • 模块:最直观的感受就是 一个xxx.py文件,其中文件名就是模块的名称。模块下一般是类

在Java编程中,一般建议一个xxx.java只写一个类(内部类的话,不考虑)。并且使用public 关键词修饰的 类名应该和文件名相同。因为python 中的py文件不仅仅是一个源码文件,它有更高的抽象概念即模块,用于组织类。

import 导入
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 .. import
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文件。

参考文献:
菜鸟

你可能感兴趣的:(python)