zoukankan      html  css  js  c++  java
  • python模块中__init__.py的作用

    基本概念
    先上结论
    举例解释
    实验一:不包含__init__.py
    实验二:A中包含__init__.py
    实验三:A.A_A中也包含__init__.py
    进阶
    基本概念
    概念 解释
    import 即导入,方式就是在import位置将代码文件拷贝过去。
    模块 python中一个.py文件就是一个模块
    包 指软件包,举例import matplotlib.pyplot中(其中pyplot非函数,至少是一个模块或者包),matplotlib就是一个软件包。
    先上结论
    __init__.py的作用是让一个呈结构化分布(以文件夹形式组织)的代码文件夹变成可以被导入import的软件包。

    举例解释
    为了形象地解释,我建立了一个test文件夹,其中一个文件夹A打算建立成一个软件包,然后尝试在B文件夹的的run.py文件下导入A包中的模块。

    实验一:不包含__init__.py
    test文件夹中包含的文件如下:

    此时如果在B/run.py中运行以下语句的结果为:

    语句 运行结果
    import A ImportError: No module named A
    import A.A_A ImportError: No module named A.A_A
    import A.A_B ImportError: No module named A.A_B
    结论:此时A并不能被当成是一个软件包。

    实验二:A中包含__init__.py
    A文件夹下包含__init__.py,test文件夹结构变为如下:

    在B/run.py中运行以下语句的结果依次列在表中:

    语句 运行结果
    import A 成功
    import A.A_A ImportError: No module named A_A
    import A.A_B 成功
    结论:由A.A_B能被成功import看出此时A已经是一个软件包,因为A下的.py文件已经能够程序识别出来。但是由于A下的A_A还不是一个软件包,所以A.A_A还不能被导入。

    实验三:A.A_A中也包含__init__.py
    A文件夹及其子文件夹下都包含__init__.py,test文件夹结构变为如下:


    在B/run.py中运行以下语句的结果依次为:

    语句 运行结果
    import A.A_B 成功
    import A.A_A 成功
    import A.A_A.A_A_A 成功
    结论:此时A及其子文件夹A_A都成功变成软件包,其中的模块可以被任意导入。

    进阶
    在上述实验中,发现导入A时并未将其下的子模块自动导入,当__init__.py文件不为空时,其中可以填写from . import A_A类似语句实现自动子模块导入。

    不含有__init__.py的包也可以当作命名空间包使用,使命名一致的包被统一管理。

    参考链接:https://blog.csdn.net/yucicheung/article/details/79445350

  • 相关阅读:
    【leetcode】Spiral Matrix
    【leetcode】Permutations
    【leetcode】Search Insert Position
    【leetcode】Search for a Range
    文件名对目标文件夹可能过长
    协同过滤和简单SVD优化
    奇异值分解(SVD)和简单图像压缩
    PCA数据降维
    FP-growth高效频繁项集发现
    关联挖掘和Aprioir算法
  • 原文地址:https://www.cnblogs.com/xiohao/p/11094868.html
Copyright © 2011-2022 走看看