如何在python中获取包的干净导入命名空间?

时间:2011-12-04 06:45:26

标签: python

我确信这是微不足道的,但我无法理解。

目录结构:

mylib/__init__.py
mylib/MyClass.py

init .py读取:

import MyClass
__all__ = [MyClass]

MyClass.py:

class MyClass(object): 
    def __init__(self):
        pass

我必须使用mylib.MyClass.MyClass()创建MyClass实例,当我希望它是mylib.MyClass()

我认为为了让这个工作,我必须把所有 = [MyClass.MyClass],但这不起作用。

你如何让这个工作?

NB。我明白这里发生了什么;文件本身就是一个命名空间,例如,你可以说,在一个文件中有多个类。但是,我在每个.py文件中只有一个类,所以我不希望这种程度的细节。

即。 我有这个:

>>> import mylib
>>> tmp = mylib.MyClass.MyClass()

我想要这个:

>>> import mylib
>>> tmp = mylib.MyClass()

1 个答案:

答案 0 :(得分:8)

__init__.py中,import MyClass尝试from MyClass import MyClass

前一个命令将模块的名称导入您的命名空间;第二个将符号模块(在本例中为类的名称)导入到命名空间中。

此外,__all__应该是名称的列表,,即字符串,而不是引用。

通常,Python将一个类别划分为一个文件没有任何优势,这样做有一些明显的缺点。通常,您的所有课程都在一个文件中,用户已经能够以mylib.MyClass的形式访问您的课程。