Python-包

具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

import时导入者不关心是文件夹还是.py;他只知道这是模块。

import aaa  此处导入的是__init__.py,产生名称空间也是__init__.py的,而且执行的是__init__.py的源代码

__init__.py增加变量代码:

执行文件test:

import aaa

print(aaa.x)
print(aaa.y)

结果是打印init里变量的值

也就是说:导入包实际上就是在导入包下面的__init__.py文件

另,import a.b.c.d    导入包才有的语法,点的左边都是包才行

环境变量就是执行文件的环境变量,固定不变的。

# test.py(执行文件)中

import sys
print(sys.path)

import aaa

# __init__.py中
import sys
print(sys.path)

# 得到的结果两个环境变量值都是一样的,都是执行文件的环境变量

所以在__init__.py中导入m1报错,因为m1没有在执行文件的环境变量里

如果要在执行文件里拿到m1,所以就要在__init__.py中添加:from aaa import m1  才能让test文件找到m1

# __init__.py中添加

from aaa.m1 import f1
from aaa.m2 import f2
# m1左边一定是个包,而且from...import后面是一个明确的名字,不能再加.

test.py中aaa.f1() aaa.f2()执行结果:

from  f1
from  f2

#因为m1/m2里面函数f1/f2的代码就是print('from f1')/print('from f2')

aaa下面有加一层bbb,test.py中加入如下代码

import aaa
aaa.bbb

# 报错

要在aaa里的init中添加from aaa import bbb才行

所以bbb下面的__init__.py就代表了bbb这个包

所以在test.py中可以执行aaa.bbb.x  结果,就是bbb下面的__init__.py里x变量的值;

再来:

bbb下面init添加

from aaa.bbb import m3

# 在test就可以用到m3    aaa.bbb.m3
# 在test也就可以直接操作m3里的f3函数    aaa.bbb.m3.f3     直接打印f3内容

那可以直接aaa.f1()吗?

# 需要去aaa下面的init中添加:

from aaa.bbb.m3 import f3

也就是说

# test中

import aaa

aaa.f1()
aaa.f2()
aaa.f3()

# 与test在同一目录的aaa下的init中
from aaa.m1 import f1
from aaa.m2 import f2
from aaa.bbb.m3 import f3

test执行没问题
#相对目录表示法:

from .m1 import f1
from .m2 import f2
from .bbb.m3 import f3

# .代表当前目录,下面也有讲。

新场景,模块的开发者在一个模块中使用自己的另一个模块

# m3.py中
from aaa.ccc.m4 import f4
def f3():
    print('f3')
    f4()

以上是绝对路径,相对路径如下:

from ..ccc.m4 import f4
def f3():
    print('f3')
    f4()

# .本目录bbb,..上级目录aaa
# 一个.就代表从当前目录找,两个.就是从上一级目录找
# .bbb.m3 两个点意义不一样。后面的是“子”的意思

如果aaa被放进了一个xxx/yyy的目录下,test该怎么找到它呢?

# test中添加新的环境变量

import sys
sys.path.append(r'C:\Users\Administrator\PycharmProjects\python19期\day5\7 包的使用\xxx\yyy')

import aaa

aaa.f1()
aaa.f2()
aaa.f3()

# 即可!

也可以在test文件添加,除非你对包内部很熟悉

from aaa.ccc.m4 import f4
f4()

import aaa.ccc.m4
aaa.ccc.m4.f4()

# 这个找的过程会触发每个文件下面的init,但这里没有依赖它

不能继续.f4了,import aaa.ccc.m4.f4   因为f4左边不是包啦

 

posted @ 2017-10-20 08:46  大雄猫  阅读(153)  评论(0编辑  收藏  举报