Discuss / Python / 关于__init__.py的疑问,个人觉得包即使没有__init__.py也可以

关于__init__.py的疑问,个人觉得包即使没有__init__.py也可以

Topic source

萌13131313

#1 Created at ... [Delete] [Delete and Lock User]

关于__init__.py有些疑问。@廖雪峰

廖老师文中说目录中必须有__init__.py文件,否则该目录就不是包。但是个人觉得包和目录在Python中没有区别,__init__.py目的是提供特定的作用,需要时创建即可。例如:

导入空目录a,a目录是一个名称空间,__package__属性时记录的是a自身:

# a是一个空目录
>>> import a
>>> a
<module 'a' (namespace)>
>>> dir(a)
['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> a.__package__
'a'

在a目录中添加了__init__.py文件后,a目录就变成了__init__.py模块,__package__属性仍然记录的自身:

>>> import a
>>> a
<module 'a' from '/root/python3/a/__init__.py'>
>>> a.__package__
'a'

所以从这里觉得对于python而言包和目录没有区别,都是名称空间。

__init__.py则是是特定场景使用,例如:

用来初始化包名称空间:

shell> echo "x = 10" > a/__init__.py
>>> import a
>>> dir(a)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'x']
>>> a.x
10

或者当具有同名的模块时,优先导入该包:

[root@3dzfiejazf a]# ls
b
[root@3dzfiejazf a]# touch b.py
[root@3dzfiejazf a]# python35 
Python 3.5.1 (default, Jan 23 2016, 19:40:20) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import b
>>> b
<module 'b' from '/root/python3/a/b.py'>
>>> quit()
[root@3dzfiejazf a]# touch b/__init__.py
[root@3dzfiejazf a]# python35 
Python 3.5.1 (default, Jan 23 2016, 19:40:20) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import b
>>> b
<module 'b' from '/root/python3/a/b/__init__.py'>

所以我觉得如果压根用不到__init__.py提供的特性,根本就不用创建__init__.py文件。


  • 1

Reply