######################模块
导入模块做的事
1.产生新的名称空间
2.以新建的名称空间为全局名称空间,执行文件的代码
3.拿到一个模块名spam,指向spam.py产生的名称空间
import 文件名 导入 在同级目录下
import x
x.foo() 之后 调用该模块下的 函数 或者变量 要加 模块名(文件名)
from ... import ...
优点:方便,不用加前缀
缺点:容易跟当前文件的名称空间冲突
可以导入文件下的一个函数
from sparm import foo
foo() -->之后 可以直接 执行
from sparm import * -->导入 所有 功能 可以 直接调用
foo()
foo2()
glo()
foo()
print (A)
备注:sparm 中 开头定义了变量 A=100 又定义了函数 foo 和 foo2 都是 打印 变量 A,
函数glo()定义了 修改全局变量 A =111 之后 再调用 foo 打印的 A 是 111 而 直接 print (A) 打印的是 100没变
######################包
#当 在写一个比较大的项目时候 会引入 包的作用
# 在别人 引用的你的 代码的时候 或者你引用别人的代码的时候 import 或者 from * import *
#在引入的一个是 文件夹的时候 其实 是在导入 该文件夹下的 __init__.py 文件
#再通过这个文件 导入 你这个文件夹 下的 其他 文件 或目录
目录结构 是这样的
test.py
glance
__init__.py (glance)
api
__init__.py (api)
testapi.py
test.py==>
import glance
glance.B()
glance目录-->__init__.py (glance)==>
from .api.api_test1 import *
from .api.mode import *
api目录-->__init__.py (api)==>
什么都没定义
testapi.py==>
def B():
print ('这个是api 下的 test1的B')
----------------------这样 在和glance同级目录的文件就 可以调用 最里面 api 目录下文件的功能了
最里面的文件 可以定义被调用的功能,放入一个列表,如果不在这个列表 就不被调用
__all__=[] 来定义;这里面存放 被调用的
===============>然后还可以 定义 如果被调用,执行什么, 自己测试 执行什么
if __name__ == '__main__':-->自己测试的结果
print ('自己测试')
else: -->调用的结果
from .api.testapi import *
print ('被其他地方调用')
===========================================以上 的执行 形式 是 glance.功能(),但是 这样有可能会 遇见功能名重复;所以 参考 下面:
###################执行形式 是 glance.文件名.功能()
目录结构 是这样的
test.py
glance
__init__.py (glance)
api
__init__.py (api)
testapi.py
test.py==>>
import glance
glance.mode.A()
glance.mode.C()
glance.api_test1.B()
glance.api_test1.D()
glance目录-->__init__.py (glance)==>
from .api import * #--->api_test1 mode
api目录-->__init__.py (api)==>
if __name__ =='__main__':
print ('这个是api')
from .api_test1 import * --># B D 功能
from .mode import * -->#AC
testapi.py==>
def B():
print ('这个是api 下的 test1的B')
def D():
print ('不该显示这个D')
mode.py==>
def A():
print ('model')
def C():
print ('不该显示这个C')