吾爱学IT

 找回密码
 立即注册
吾爱学IT 程序人生 Python开发 查看内容

python 中__init__.py文件的作用

2019-3-12 21:17| 发布者: admin| 查看: 278| 评论: 0

摘要: 1、很多地方的文件夹都有__init__.py。网上一般都说,有了这个东西会把它当作一个包,否则import这个文件夹会出错。但这就好像和说python文件中如果有中文就要在开头写 # coding =utf8这句话一样,说话囫囵吞枣不带 ...
1、很多地方的文件夹都有__init__.py。网上一般都说,有了这个东西会把它当作一个包,否则import这个文件夹会出错。

但这就好像和说python文件中如果有中文就要在开头写 # coding =utf8这句话一样,说话囫囵吞枣不带语境,导致误会新手。

 

2、实际上空的__init__.py文件在python3.3以上没有卵的必要。

如果用python3.3以上在__init__.py中写了内容,那要这个文件还差不多,否则来个空的__init__.py基本上是多此一举。就和在python3里面写# coding =utf8多此一举一样。

 

3、现在假设有这么一个目录,里面有:

一个名叫pac的文件夹(里面没有__init__.py文件)

一个pac.py的文件

一个run.py文件

 

在run.py里面写上 import pac,

3.1如果是python2,import pac实际上导入 的是pac.py,如果删除了pac.py那么就会报错,因为不能能import 一个文件夹,python2只能导入pac.py或者pac文件夹里面有__init__.py这种情况,类似的你写pac.txt  pac.ppt,写个import pac也是不能导入的,不认他。

3.2如果是python3,那么import pac情况不一样,import  pac到底导入的是个啥?

需要分很多种情况,一种是pac文件夹里面有__init__.py,一种是没有__init__.py,一种是连pac文件夹都没有,一种是你当前文件夹下还有一个叫pac.py的文件,一种是没这个pac.py的文件,这一下子就多了五种情况了。

 

3.2.1当写import pac时候,优先查找有没有pac文件夹里面有__init__.py的这个文件夹,如果找到了,那么此时的pac代表的是有__init__.py的pac文件夹(包)。

3.3.2如果3.2.1步骤没找到,那么再去查找有没有一个叫pac.py的文件,找到了那么 pac就代表pac.py了。

3.2.3如果连pac.py都没找到,就去找一个文件夹,这个文件夹不包含__init__.py,如果找到了这个文件夹,那么就会自动把这个文件夹当作包。

3.2.4如果执行3.2.3也没找到pac,那么就会报错了,ImportError: No module named pac

 

4.、总结一下,python2和python3的查找顺序差不多,但是python2少了3.2.3这一步,即如果只有pac文件夹,你就import pac那就会报错。

 

 

有__init__.py的包,叫做Regular packages ,常规包,python2只支持这个。

没有__init__.py的包,叫做Namespace package,命名空间包,python3.3以上支持这种。

 

Namespace package这个东西是在pep420里面新增的。

 

5、为了兼容python2和3,那就有必要写__init__.py;如果从不用python2,也不知道__init__.py里面可以写什么东西,只知道他是代表一个文件夹是一个包这一个作用的人,那就不需要有这个文件。



希望本文所述对大家程序设计有所帮助。
1

路过
1

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (2 人)

QQ|Archiver|手机版|小黑屋|站点地图|吾爱学IT |网站地图

GMT+8, 2021-1-19 11:18 , Processed in 0.113753 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部