在__init__.py中访问时__name__的值是什么

1 投票
2 回答
1065 浏览
提问于 2025-04-18 17:19

我现在的理解是,当你写 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__';这个名字不会因为脚本中导入的内容而改变。

撰写回答