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

2024-09-30 00:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法只从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之外,还有其他方法可以提供所需的行为吗?你知道吗


Tags: 模块offrompyimport类型hereobject
3条回答

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

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

__all__ = ['Foo', 'Bar']

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

from a import *

当然,这种行为并不总是被鼓励的,人们更倾向于另一种选择:

from a import Foo, Bar

您可以直接导入名称:

from a import Foo, Bar

或者,您可以在a.py中定义^{}

__all__ = ['Foo', 'Bar']

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

from a import *

不过,对于两个名称,使用第一个解决方案会更容易。你知道吗

相关问题 更多 >

    热门问题