如何从模块中导入 类 的列表?
How do you import a list of classes from a module?
有没有办法从 Python 模块中只导入特定的、预定义的 类 列表?例如,假设我在同一目录中有模块 a.py
和 b.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
,那么您可以避免这些限制。
有没有办法从 Python 模块中只导入特定的、预定义的 类 列表?例如,假设我在同一目录中有模块 a.py
和 b.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
,那么您可以避免这些限制。