是否有可能在Python中使模块可迭代?

时间:2015-09-15 19:49:58

标签: python module iterable

我正在创建一个模块,我想将其视为对象的静态容器。这些对象属于我定义的类类型。我希望能够导入此模块,然后循环遍历其中的对象。以下是一些解释我的意思的代码:

example.py

class MyExampleClass(object):
    def __init__(self, var1, var2, var3):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        self.var4 = var4

instanceA = MyExampleClass(1, 2, 3, 4)
instanceB = MyExampleClass(4, 3, 6, 7)
instanceC = MyExampleClass(5, 3, 4, 5)

# something like this
def __iter__():
    return (instanceA, instanceB, instanceC)

然后我希望能够导入它并像枚举一样使用它:

import example

for e in example:
   # do stuff with e

这可以用Python做吗?或者我是否必须从example包中导入列表?

example.py

objects = (instanceA, instanceB, instanceC)

然后

import example

for e in example.objects:
    # do stuff with e

2 个答案:

答案 0 :(得分:4)

您可以通过在模块中定义根类并使用该类的实例替换模块来实现此目的。这是一个例子:

class ModuleClass(object):
    __init__(self):
        self.instanceA = MyExampleClass(1, 2, 3, 4)
        ...

    __iter__(self):
        # Your iterator logic here

# and then in the same module code
sys.modules[__name__] = ModuleClass()

那么你可以做你想做的事情,因为当你导入那个模块时,它实际上是你自定义的可迭代ModuleClass的一个实例:

import example

for e in example:
   # do stuff with e

答案 1 :(得分:3)

虽然我不推荐它,但您可以通过继承types.ModuleType来构建自己的模块。然后,您可以使用sys.modules[__name__] = NewModule()

将自定义类替换为原始模块
import types
import sys

class MyExampleClass(object):
    def __init__(self, var1, var2, var3, var4):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        self.var4 = var4

class MyModule(types.ModuleType):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.instanceA = MyExampleClass(1, 2, 3, 4)
        self.instanceB = MyExampleClass(4, 3, 6, 7)
        self.instanceC = MyExampleClass(5, 3, 4, 5)

    def __iter__(self):
        return iter([self.instanceA, self.instanceB, self.instanceC])

sys.modules[__name__] = MyModule("example") # Name of the module