python模块之包

Posted 蔠缬草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
"""
    ‘.‘代表当前目录
    优点:可以随意挪动,只要能找包,里面的模块就能正常导入
    缺点:不能在包内使用包中的其他模块,执行导入会报错
"""

 

   

以上是关于python模块之包的主要内容,如果未能解决你的问题,请参考以下文章

python模块之包

python学习的第十八天模块之包相对搜索路径和绝对搜索路径

python 3 基础之包

Java之包及内部类

Go语言基础之包的概念

Node.js之包命令(npm和yarn)