每个模块都有相应的名称,可以通过特殊变量__name__获取,正常情况下,模块的名称对应源文件名,仅有一个例外,就是当一个模块被作为程序入口时,它的__name__值为“main”,我们利用这一特点,可以将模块源代码文件中的测试代码进行独立的处理,而不影响模块被其它程序调用
import语句的基本语法:
import 模块名 # 导入一个模块
import 模块1,模块2 # 导入多个模块
import 模块名 as 模块别名 # 导入模块并使用新名字
import加载的模块分为四个类别:
import的本质时使用了内置函数__import__()
通过import导入一个模块时,python解释器进行执行,最终生成一个对象,这个对象就是代表被加载的模块
导入的是模块中的一个函数或一个类
基本语法:
from 模块名 import 成员1,成员2,...
from 模块名 import * # 导入一个模块中所有的成员
当导入一个模块时,模块中的代码都会被执行,不过,如果再次导入这个模块,则代码不会再次执行
为什么这个设计?
因为导入模块更多的时候需要的是定义模块中的变量,函数,对象等,这些东西并不需要被反复定义和执行。所以只导入一次就成了一种优化
一个模块无论被导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象
如果确实需要多次加载,操作如下:
import math
import importlib
importlib.reload(math)
当一个项目中有许多模块时,我们将功能类似的模块放到一起,就形成了”包“,本质上,”包“就是一个必须有__init__.py的文件夹,包下面可以包含模块,也可以再包含子包(subpackage),就像是文件夹下面可以有文件,也可以有子文件夹一样
导入包的本质其实是导入了包的__init__.py文件,即,当import package1时程序执行了包的__init__.py文件。这样可以在__init__.py中进行所需模块的批量导入,而不用一个一个导入
import *理论上时希望文件系统找出包中的所有子模块,然后导入它们。这可能会发较长时间。基于此,Python给出的解决方案是提供一个明确的包索引
这个索引由__init__.py 定义 all__变量,该变量为列表,如package1包下的__init.py中,可定义__all__=[“module A1”,“module A2”],这样,当from package1 import * 时,就可执行两个子包module A1和module A2的导入
当我们导入某个模块时,Python解释器一般按照如下路径寻找该模块:
当任何一个程序启动时,会把上述的这些搜索路径(除内置模块)进行收集并放到sys模块的path属性中(sys.path)
步骤:
from distutils.core import setup
setup(
name="flying_distance", # 对外发布的模块名
version="1.0", # 版本号
decription="这是一个对外发布的模块,用于计算距离",
author="c2h4ds",
author_email="xxxxxxx",
py_modules=["flying_distance.flying_distance1"] # 要发布的具体模块
)
python setup.py sdist
pyhton setup.py install
即可安装在python/Lib/site-packages目录下