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里面可以写什么东西,只知道他是代表一个文件夹是一个包这一个作用的人,那就不需要有这个文件。 希望本文所述对大家程序设计有所帮助。 |