星光

浅析__init__.py和Python的模块导入

id=53054611


 

__init__.py是python模块化编程中非常关键的一个元素,我原来总是不理解它,所以经常被各种import搞得头疼不已

比如学flask时基本都会看到的 from app import app 的写法,至少我个人看到时是非常困惑的

其实只要了解了最普通情况,相应特殊情况也能很轻松的迎刃而解。因为这块还是不是很熟,说得不对的地方还望指正


 

先从最简单的开始,同一目录下的导入

有上述三个文件,file1里面存放函数,file2和file3把file1当模块导入

file1.py

file2.py

file3.py

因为在同一目录下,解释器只要在此运行,并不需要__init__.py,而file2和file3中展示了两种导入方法,from文件import和直接import,前者可以选择性的导入自己想要的东西,后者相当于全部导入。前者导入后类似于C中的include,直接调用类和函数即可,后者还得带上“前缀”


 

那么遇到这样的情况呢

 

这个时候直接导入,则会报错

这个时候__init__.py的第一个作用就出现了,在子目录中添加哪怕是一个空的__init__.py,Python都可以找到其中的文件

这时候执行如下指令就不会报错了

所以很多大工程基本都是根目录和子目录下都有__init__.py存在的,就像这样子


接下来说__init__.py的第二个功能,与其说是功能,不如说是特点吧,也是我之前的困扰所在吧

简言之,__init__.py中的内容是“暴露”在当前目录下的,比如我们将之前file1中的a函数copy到同目录下的__init__.py中

如果要使用file1中的a函数,演示如下

上面是我在ipython下的演示,中间用了tab的自动补全

如果是用__init__.py中的a函数呢?直接import a 即可。。。虽然很想这么说,但是我敲着敲着才发现那只是自己的脑洞。。__init__.py的这个性质貌似只能从上级目录进行访问时才能起效

此时我修改submodules目录下的__init__.py内容为

然后在此根目录下执行 from submodules import 然后按tab,就出现了如下结果,__init__.py中的类(内容)直接暴露了,而file4.py则还需要像之前一样导入

同理,我们修改根目录中的__init__.py中的内容,因为我最初以为是函数的锅,换成类就可以了,事实发现还是印证了刚刚所说的

根目录下的__init__.py

执行以下探索

Talk is cheap,如上所述,自然一目了然,比较让我shock的是import不光光可以导入类,还可以直接导入函数,甚至变量。。。(刚刚试了下)

当然利用上述的特性,__init__.py可以用来简化操作~我最初因为这个只是用来放初始化代码的,事实证明我错了,这个更像是一个索引

总结一下__init__.py的三个作用:

第一是帮助Python找到子目录下的文件,便于进行导入

第二是在子目录下的__init__.py中的内容相当于暴露了,可以直接进行操作,毕竟我也从未见过

from __init__  import x 和 import __init__ 一说

第三就是基于一二点了~在__init__.py中进行了其他模块的导入的话,这样在上级目录中就可以更方便的访问这些模块,而不用一个个. . . import了


呼,终于写完了,大概写了1个多小时,希望对学到这块的人能够有所帮助吧,这种内容果然还是应该用Markdown+Ghost来写,WP真是天生不适合写这种文章,恩,考虑以后用Ghost写有代码的文章(实在没脸说技术文),WP写心情和日常了


鸣谢 Ipython ,按下Tab有回应的Python命令行开发神器哦~个人当IDE用

参考: Be Pythonic: __init__.py

如无特殊声明,欢迎转载,但是请注明来自星之所在《浅析__init__.py和Python的模块导入》

评论

  1. Starlight #1

    看的不舒服的话,可以看GitHub 上的http://t.cn/RUfPqop

    回复
    2015-10-31
  2. Starlight #2

    或者Ghost博客,试水中,笑~感谢小可提供的服务器 http://www.jimmy66.org/qian-xi-__init__-pyhe-pythonde-mo-kuai-dao-ru/

    回复
    2015-10-31
  3. 正儿八经是小可 #3

    赞,对啦,顺便又发现了新的VPS资源,价格不变,768M内存~

    回复
    2015-11-6
  4. shy泠 #4

    :roll: 我突然想起我刚看flask时。。。。新建文件命名flask.py。。。然后运行各种import出错。各种找不到原因

    回复
    2015-12-5
    • Starlight

      2333,导入优先级的问题哈

      回复
      2015-12-5
      • shy泠

        :smile: 主要是之前写java,php之类的从来没遇到过这样的事情。。直接晕了= =,话说表情不会显示诶

        回复
        2015-12-5
        • Starlight

          这个啊~原先的WP版本可以显示出来的~超萌的说,后来WP升级,就是调用墙外的emoji表情了。你挂个全局就能看到了。因为前端很渣(后端也不懂)所以一直没修改,有空倒腾下w

          回复
          2015-12-5
          • shy泠

            =。=问题是图片的url没在墙外吧。。http://jimmy66.com/wp-content/themes/simplehome/smilies/simple-smile.png

            2015-12-5
          • Starlight

            貌似真是这样的,和之前的不一样诶,我回头弄下w

            2015-12-5
          • shy泠

            :smile: :smile: :smile:

            2015-12-5
  5. 某宅 #5

    Python什么的,完全看不懂-0-

    回复
    2015-12-12