在__init__.py中访问时__name__的值是什么
我现在的理解是,当你写 from foo import bar
时,foo
是一个包,并且它有一个 __init__.py
文件,这个文件会自动被处理,然后它里面的资源 bar
就会被导入。如果我在命令行中输入 python manage.py
,然后在这个模块里调用 from foo import bar
,那么在属于 foo
包的 __init__.py
文件中,变量 __name__
是不是等于包的名字?也就是在这个情况下是 foo
吗?
2 个回答
-3
__name__
是你用 Python 调用的模块的本地范围内的一个属性,也就是说,在这个例子中就是 manage.py
这个文件。
6
在一个包的 __init__
模块中,__name__
被设置为包的名字;也就是说,它在 sys.modules
中的存储名称。
比如,对于一个包 foo
,__name__
就被设置为 'foo'
:
>>> import os
>>> os.mkdir('foo')
>>> open('foo/__init__.py', 'w').write('print "__name__:", __name__')
>>> open('foo/bar.py', 'w').write('# nothing done here')
>>> from foo import bar
__name__: foo
>>> import sys
>>> sys.modules['foo']
<module 'foo' from 'foo/__init__.py'>
>>> sys.modules['foo'].__name__
'foo'
需要注意的是,每个 Python 模块都有这样一个 __name__
变量;甚至连最开始的脚本也是如此。如果你运行 python manage.py
,那么最开始的脚本会被加载为 __main__
模块,所以在 manage.py
中,名字被设置为 '__main__'
;这个名字不会因为脚本中导入的内容而改变。