python模块之包

  包:将解决一类问题的模块放在同一目录下就形成了一个包

  为了更好的了解包,我们就模拟创建一个包

import os

os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
lis = [open('glance/__init__.py', 'w'), 
         open('glance/api/__init__.py', 'w'),     
         open('glance/api/policy.py', 'w'),
         open('glance/api/versions.py', 'w'), 
         open('glance/cmd/__init__.py', 'w'), 
         open('glance/cmd/manage.py', 'w'),
         open('glance/db/__init__.py', 'w'), 
         open('glance/db/models.py', 'w')]
map(lambda f: f.close(), lis)    

  我们创建的那些'.py'文件就相当于一个个模块,可以在里面写一个简单的函数,用作测试。

  包中模块的导入

# 通过包名.目录.模块名 将包内部的模块导入
import glance.api.policy as policy
policy.get()

  __init__.py文件的作用

# 每个包下面都要有一个__init__.py文件 导入包时,就会执行这个文件
f = open('glance/__init__.py', 'w', encoding='utf-8')
f.write("print('this is glance/__init__.py')")
f.close()
import glance  # 打印this is glance/__init__.py

  因此在我们自己创建一个包时,就可以利用__init__.py在完成内层的导入工作。

"""
    因此可以通过在__init__.py文件提前写好包的下一层的导入代码
        from glance import api
        from glance import cmd
        from glance import db
"""
f = open('glance/api/__init__.py', 'w', encoding='utf-8')
f.write("print('this is glance/api/__init__.py')")
f.close()
# 执行了from glance import api 进而执行了api下的__init__.py
import glance  # 打印this is glance/api/__init__.py

# 在api下的__init__.py写好 from glance.api import policy
import glance
glance.api.policy.get()  # 打印from policy.py
"""
    通过这种提前在__init__.py文件中写好下一层所有内容的导入代码的方式
    只需要import包名就可以导入下面的所有模块
"""

  一般有两种导入方式:绝对路径导入和相对路径导入

  1,绝对路径导入

# 绝对路径导入  在__init__.py文件中写导入代码时,使用绝对路径,如:from glance.api import policy
"""
    优点:导入后,不管在包内部还是外部都可以使用,并且直观。
    缺点:不能挪动,不然就会找不对路径
"""

  2,相对路径导入

# 相对路径导入 在__init__.py文件中写导入代码时,使用相对路径,如:from . import policy
"""
    '.'代表当前目录
    优点:可以随意挪动,只要能找包,里面的模块就能正常导入
    缺点:不能在包内使用包中的其他模块,执行导入会报错
"""

   

原文地址:https://www.cnblogs.com/zxc-Weblog/p/8298238.html