Python包管理

一、什么是包?

简单来说包即是目录,但和普通目录不同,它除了包含python文件以外,还包含一个__init__.py文件,同时它允许嵌套。

包结构如下:

package/__init__.py
        module1.py
            class C1:pass
        module2.py
            class C2:pass
        subpackage/__init__.py
                   module1.py                    
                      module2.py                  
                   module3.py

main.py

import package
import package.module1
import package.subpackage
import package.subpackage.module1

from package import module1
from package import subpackage
from package.subpackage import module1
# from package import module3

二、__init__.py的作用

  1. 区别包和普通目录

  2. 可以使模块中的对象变成包可见

    例如:要导入package包下module1中的类Test, 当__init__.py文件为空的时候需要使用完整的导入路径:from package.module import Test, 但如果在__init__.py中添加from module1 import Test语句,就可以直接使用from package import Test来导入类Test。

  3. 通过在该文件中定义__all__变量,控制需要导入的子包或模块。

三、__all__的作用

__all__只控制from xxx import *的行为, 不影响importfrom xxx import xxxx的行为

  1. __init__.py文件中添加:

    __all__ = ['module1', 'subpackage']

    __init__.py不使用__all__属性,不能通过from package import *导入

    __init__.py使用__all__属性,from package import *只能导入__all__列表中的成员,但可以通过

    import package.module2from package import module2导入

  2. 在普通*.py文件中添加:__all__

    # from xxx import * 这种方式只能导入公有的属性,方法或类【无法导入以单下划线开头(protected)或以双下划线开头(private)的属性,方法或类】
    
    # from xxx import aa, bb 可以导入public,protected,private
    # import xxx   xxx.__func  可以访问public,protected,private

    模块中不使用__all__属性,可以导入模块内的所有公有属性,函数和类 。

    模块中使用__all__属性,只能导入__all__中定义的属性,函数和类(包括私有属性和保护属性)。

四、from ... import ...的问题

  1. 命名空间的冲突

    # module1.py
    def add()
        print("add in module1")
    # module1.py
    def add()
        print("add in module2")
    
    # main.py
    from package.module1 import add
    from package.module2 import add
    
    # 最近导入的add,会覆盖先导入的add
  1. 循环嵌套导入的问题

    # module1.py
    from module2 import g
    def x()
        pass
    # module2.py
    from module1 import x
    def g()
        pass
    
    # 会抛出一个ImportError: cannot import name 'g'异常,解决方法直接使用import 语句

   转载规则


《Python包管理》 Ace 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Python中with的用法 Python中with的用法
一、什么是with语句​ 对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。 # 操作文件的方式 # 普通方式操作文件 f = open('test
2019-11-28
下一篇 
Pyhton高数计算库 Pyhton高数计算库
math数学库# 导入math库 import math # 常用数学常量 math.pi # π math.e math.inf # ∞ math.nan # not a num # 指数/对数/开平方 ma
2019-11-25
  目录