【问题标题】:How do you import a list of classes from a module?如何从模块中导入类列表?
【发布时间】:2015-03-20 16:42:05
【问题描述】:

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

【问题讨论】:

    标签: python class import module python-import


    【解决方案1】:

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

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

    像这样使用它:

    import a
    gettypes(a.aTypes)
    

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

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

    【讨论】:

    • gettypes的第一个参数不是必须的吗?
    【解决方案2】:

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

    __all__ = ['Foo', 'Bar']
    

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

    from a import *
    

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

    from a import Foo, Bar
    

    【讨论】:

      【解决方案3】:

      您可以直接导入名称:

      from a import Foo, Bar
      

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

      __all__ = ['Foo', 'Bar']
      

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

      from a import *
      

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

      【讨论】:

      • 不仅更容易,而且可能是最好的。这样,任何人只要查看文件顶部就可以知道符号的来源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多