【发布时间】:2011-01-24 11:06:38
【问题描述】:
我刚刚读到一篇文章,据说它向我介绍了一个新概念:到目前为止,我确信 python 包(即带有 __init__.py 文件的目录)的行为与 java 包完全相同,也就是说 - 很少命名空间来帮助安排代码(减去 java 的“包”范围)。
但是,根据这个链接:
A Short Digression Into Multi-File Modules,如果我将所有文件放在同一个“包”中:
整个文件集合作为单个模块呈现给其他 Python 代码——就好像所有函数和类都在一个 .py 中一样
所以现在我认为我对 python“包”的整个理解是错误的。此外 - 它完全不是一个包,而是作者所说的“多文件模块”。
所以,据我了解,无论我在一个包中划分我的函数和类有多少个文件,从外部来看,该包应该看起来好像我从包内的所有文件中获取了所有代码并放入它而是在一个与包同名的大文件中,即作为一个模块。
例如,如果我有以下文件结构:
/base
/animals
/__init__.py
/dog.py
在 dog.py 中:
def bark():
print "woof"
它应该与拥有完全相同:
/base
/animals.py
在animals.py中:
def bark():
print 'woof'
因此,下一段代码在这两种情况下都应该运行良好:
from base import animals
animals.bark()
这当然会在第一种情况下产生:
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'bark'
我在这里缺少什么?我看到“动物”确实被视为一个模块的例外情况,但似乎我仍然必须明确声明animals.dog.bark,即包的内部文件结构不是从外部抽象出来的。
我错过了作者的观点,还是没有正确实施?
=== 编辑 ===
只是为了确保没有人错过引用中的这一行:
好像所有的函数和类都在一个.py中
不管如何实际访问这个函数和类,上面的引用明确指出,如果你在文件 a 中有一个 func1,在文件 b 中有一个 func2,不管它们可以从哪个路径访问,如果我们将此路径表示为X 那么,根据上述引用,X.func1 和 X.func2 都应该可以工作。
【问题讨论】:
-
我在链接页面上找不到该报价。想再试一次吗?
-
@Ignacio: diveintopython3.org/…
-
@ignacio - 抱歉,已更正链接