模块与包

模块(一个py文件):

导入一个模块时会把这个模块从头到尾执行一遍。为了防止导入模块时执行模块中的执行语句可以在编写模块时候将执行语句写在"if __name__ == '__main__':",这样被别人当模块导入时因为不满足if条件执行语句就
不会被执行了(__name__是模块自带的一个变量,当自己执行相应模块时__name__的值是"__main__",当被其他模块导入时该变量为该模块的名字。)。
导入一个模块时会现在当前的目录搜索该模块文件,当前目录没有该模块文件时再去系统目录搜索(通过sys模块中的sys.path可以看到搜索的什么系统目录,并且依次从前往后搜索)。
import os as bieming =========>给导入的模块起个别名"bieming"


模块的重新导入:
已经导入一个模块后又对该模块进行了修改,要想让新修改的部分生效需要重新加载该模块。重新加载该模块的方式为:
from tmp import *
reload(test)


一个模块中可以包含一个__all__变量,此变量为一个列表,它限制了别人导入该模块时能导入的内容。
例:
模块1:
__all__ = ['test1'] =======> 利用__all__限制此模块被别人导入时能导入的内容
def test1():
  print('test1')
def test2():
  print('test2')

模块2:
from 模块1 import * =======> 此时只能导入test1.


包(包含若干py文件的文件夹)(注意:以后导包的时候统一使用from方式,以免出现混淆):

from 包 import * :通过*号这种形式导入包中模块时默认是不能导入的。
要想这样导入必须在包内创建一个__init__文件,然后在以下方法中挑一个进行设置后方能导入:
1、在包中__init__文件中加入__all__参数告诉程序哪些包能导入。
2、在包中通过若干'from . import 模块'代码告诉程序哪些模块可以导入

注意:
1、当导入一个包时,会将这个包中的__init__文件从头到尾执行一遍(例如:在__init__文件中含有‘print(123)’,则在导包的时候会打印‘123’)。
2、当使用‘from 包 import 模块’这种精确导入方式时包内可以不包含__init__文件

模块发布:
在包当前路径新建文件setup.py。setup.py文件包含:
"
from distutils.core import setup
setup(name='laowang',version='1.0',description='miaoshu',author='laowang',py_modules=['包名.模块名'])
"
python3 setup.py build ==========>构建模块
python3 setup.py sdist ==========>生成发布压缩包

解压压缩包后执行:
python3 setup.py install

原文地址:https://www.cnblogs.com/baihualin/p/10345208.html