如何从模块导入类列表?

时间:2015-01-22 00:36:21

标签: python class import module python-import

有没有办法只从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的替代方案可以提供所需的行为?

3 个答案:

答案 0 :(得分:4)

您可以直接导入名称:

from a import Foo, Bar

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

__all__ = ['Foo', 'Bar']

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

from a import *

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

答案 1 :(得分:1)

假设你确实需要这样做(处理类型列表)并且不能使用__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,那么您可以避免这些限制。

答案 2 :(得分:0)

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

__all__ = ['Foo', 'Bar']

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

from a import *

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

from a import Foo, Bar