繁体   English   中英

如何从模块导入类列表?

[英]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 *

不过,仅使用两个名称,使用第一个解决方案会更容易。

假设您确实确实需要执行此操作(处理类型列表),并且不能使用仅工作一次的__all__之类的技巧(每个模块一个这样的特殊列表),然后:

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

像这样使用它:

import a
gettypes(a.aTypes)

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

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

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

__all__ = ['Foo', 'Bar']

这将使您可以通过以下方式导入它:

from a import *

当然,并非总是鼓励这种行为,因此首选替代方法:

from a import Foo, Bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM