1

在我的工作 python 目录中,我创建:

packagename/__init__.py
packagename/modulename.py
test.py

在 modulename.py 我创建了一些空类:

class Someclass(object):
   pass

在 test.py 中:

import packagename
packagename.modulename.Someclass()

为什么我不能在 test.py 中调用 packagename.modulename.someclass() ?

AttributeError: 'module' object has no attribute 'modulename'

我知道正确的方法是:

import packagename.modulename

或者

from packagename import modulename

但我不明白为什么我会收到这个错误。

更新:

换句话说,有什么方法可以将包的内容与不同命名空间中的所有模块一起导入?我需要正确的pythonic表达式:

from packagename import * as mynamespace
4

3 回答 3

2

Python 不会自动递归和导入子包。当你说:

import packagename

这就是它进口的全部。如果你说:

import packagename.modulename

然后它首先导入packagename,然后导入packagename.modulename分配对它的引用作为 的属性packagename。因此,当您在代码中说:

packagename.modulename.Someclass()

Python 只是使用100% 的普通属性查找。packagename首先在当前命名空间中查找变量。然后查找对象的modulename属性packagename。然后查找对象的Someclass属性modulename

如果你忽略了 import packagename.modulename,那么在called上显然没有属性,从今以后.packagenamemodulenameAttributeError

我建议你弹出命令行并导入一些东西,然后使用dir()它来检查它。然后导入一个子包,dir()再次使用。你会很快看到差异。


最后,语法:

from packagename.modulename import SomePackage

与此基本相同:

import packagename.modulename
SomePackage = packagename.modulename.SomePackage

(当然,它的实现方式不同,但结果或多或少相同)。

这有帮助吗?

于 2009-12-27T19:40:41.770 回答
1

如果您在“packagename”包中有 100 个模块,您是否希望在仅导入顶级名称时自动导入它们?这通常不是一个好主意,所以 Python 不这样做。

如果您想自动导入该特定模块,只需将其包含在__init__.py如下内容中:

from packagename import modulename

或者,使用 Python 2.5 或 2.6:

from __future__ import absolute_import
from . import modulename

(在以后的版本中,您可以放弃该from __future__部分。)

编辑:没有内置机制要求 Python 在包中导入所有可能的子模块。这不是一个常见的用例,最好通过__init__.py精确地导入那些你想要的东西来明确处理它。可以将一些东西放在一起来完成这项工作(使用__import__()等),但在大多数情况下,最好按照描述显式导入所有子模块。

于 2009-12-27T19:39:24.727 回答
0

有些包非常大,导入其中的所有内容会花费很多时间。最好为导入提供细粒度,这样用户只导入他真正需要的东西。

于 2009-12-27T19:37:47.690 回答