模块与包

#导入模块后,产生了3中作用
#1.创建了模块的名称空间,用来存放模块文件中定义的名字
#2.基于刚刚创建的模块名称空间,来执行模块文件中的代码
#3.能用该模块名指向该名称空间,模块名.名字(来自名称空间)的操作进行调用
#1
# import spam
#
# money =123456789
# print(spam.money) #模块名.名字调用模块文件中定义的变量
# spam.read1() #模块名.名字调用模块文件中定义的函数
# spam.read2()
# spam.change()
# print(money,'from test')
# print(spam.money,'from spam')
#2
# from spam import money,read1,read2
# print(money) #这个money取自模块名称空间中,相当于内建名称空间,内建名称空间在启动软件时就启动了
# #模块名称空间,在模块被导入时就开辟了
# money =100000
# print(money) #这个money取自最近的赋值,所有在变量命名时,不要让变量名与内建名或模块中的名称相同
# read1()
# read1 =1231231
# #read1()
#read2()
#模块的导入的方式有,1.import 模块名,2.from xxxx import yyy 即从xxxx中导入yyy
#注:模块都是文件,导入的模块有三种类型,1.自定义的 2.内置的 3.第三方下载的
#需要注意的是自定义和第三方下载的模块在导入时,它们的路径都应该在sys.path的列表中,如果
#不在,就要把它们加到其中,一般情况下,
# 第三方下载的模块都放在D:\Program Files(x86)\python3\lib\site-packages
#自定义的模块,把它的路径放到sys.path的列表中
# import sys
# print(sys.path)
#3 from spam import * 中'*'的作用,如果spam.py中__all__=[],就会触动__all__
#如果没有__all__,则代表spam名称空间中所有定义的名称
#from spam import * #spam.py中有__all__=['money','read1'],就触动__all__
#即'*'代表money ,read1
#print(money) #在模块中导入了money
#read1() #在模块中导入了read1
#read2() #全局名称空间中没有定义,模块中也没导入该名称
#4 模块的查找:优先从内存中查找,再到内建中找,最后在sys.path列表中
#5.__main__的作用
#if __name__ == '__main__': 作用是声明在当前文件中执行时,才成立,当它被当成模块
#被导入时,就不成立了.所有在写代码的时候,一般把要调用的代码写在它的下面

#包,包是一个有层次的文件目录结构,模块对应单个文件,包对应一个目录.与类和模块相同,
#包也使用.属性来调用他们.注:每生成一个包,就会自动在包中生成一个__init__.py文件

#1.有关包的导入注意点,
#1.凡是import 名称x.名称y...等形式的,带点的左边都必须是一个包,即x是包,y可能是包
#2.凡是from...import 名称z 等形式的,名称z一定不能是带点的
# import sys
# sys.path.append(r'D:Program Files(x86)py_fallstack_s4py_day23包')
# import glance.api.policy as policy
# policy.pol()
#import glance.api.policy.pol#报错,在pol的左边的policy必须是一个包
# from glance.api import policy
# policy.pol()
# from glance import api #api是一个包,该语句是执行api包中的__init__.py文件
# api.policy.pol()#调用api包中policy模块下的pol函数,必须在api包中
# # 的__init__.py中添加from . import policy 其中'.'表示api,即是
# #from api import policy
# print(api.policy)
# from glance.api import policy
# policy.pol()
# import glance.db.models as mod
# mod.mod('ssss')
# from glance.api.policy import pol #在导入包时,首先会执行包中的__inti__.py
# pol()

#2.如果判断是包:
#凡是在导入时形如:xxx.yyy的,都是导入包
#
# from glance.api import * #必须从最外层的包开始,'*'触发__all__方法
# policy.pol()#相当于__init__.属性
# print(versions)
#3.包的作用
#把多个模块文件,进行分类,使调用模块更清楚,注:包是用于被导入的,所以不是在包内进行调用的.
#4.对于包来说应该遵循以下原则:可以用inport导入内置或者第三方模块
#但是要绝对避免使用import来导入自定义包的子模块,应该使用from...import...的绝对或相对
#导入,且包的相对导入只能用from的形式
原文地址:https://www.cnblogs.com/IQ-Python/p/6802049.html