如何从模块中导入 类 的列表?

How do you import a list of classes from a module?

有没有办法从 Python 模块中只导入特定的、预定义的 类 列表?例如,假设我在同一目录中有模块 a.pyb.py,代码如下:

#a.py
class Foo(object):
    '''definition of class Foo goes here'''

class Bar(object):
    '''definition of class Bar goes here'''

aTypes = [Foo, Bar]

_

#b.py
from a import aTypes

print Foo

运行 b.py 当然会导致 print Foo 行引发 NameError。我真的不认为这会起作用(b.py 中的 import 语句给了我一个 a.Foo 类型而不是 Foo 类型),但我想不出正确的语法.是否有 from a import aTypes 的替代方法来提供所需的行为?

您可以直接导入名称:

from a import Foo, Bar

或者,您可以在 a.py 中定义 __all__:

__all__ = ['Foo', 'Bar']

然后在 b.py 中进行通配符导入:

from a import *

虽然只有两个名字,使用第一个解决方案会更容易。

您可以在 a.py 的模块级别定义 __all__:

__all__ = ['Foo', 'Bar']

这将允许您通过以下方式导入它:

from a import *

当然,并不总是鼓励这种行为,而是首选替代方案:

from a import Foo, Bar

假设你真的需要这样做(处理类型列表)并且不能使用像 __all__ 这样只能工作一次的技巧(每个模块一个这样的特殊列表),那么:

def gettypes(types):
    thismodule = sys.modules[__name__]
    for t in types:
        setattr(thismodule, t.__name__, t)

这样使用:

import a
gettypes(a.aTypes)

我很难想象你为什么需要这个,但这不是我的问题;-)

请注意 __name__ 的使用意味着这通常不适用于符号,仅适用于 类、模块、函数和我忘记的任何其他内容(或在紧要关头用于对象您自己设计的 __name__)。它也不适用于您在模块中使用别名的内容,例如通过在模块中编写 Baz = Bar 然后在列表中使用 Baz。如果列表是 ['Foo', 'Bar'] 而不是 [Foo, Bar],并且您还将源模块传递到 gettypes,那么您可以避免这些限制。