是否可以使模块在 Python 中可迭代?
Is it possible to make a module iterable in Python?
我正在制作一个模块,我想将其视为对象的静态容器。这些对象属于我定义的 class 类型。我希望能够导入此模块,然后遍历其中的对象。这是一些解释我的意思的代码:
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
您可以通过在模块中定义一个根 class 并将模块替换为该 class 的实例来实现。这是一个例子:
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
虽然我不推荐,但是你可以通过继承types.ModuleType
来构建你自己的模块。然后,您可以用自定义的 class 和 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
我正在制作一个模块,我想将其视为对象的静态容器。这些对象属于我定义的 class 类型。我希望能够导入此模块,然后遍历其中的对象。这是一些解释我的意思的代码:
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
您可以通过在模块中定义一个根 class 并将模块替换为该 class 的实例来实现。这是一个例子:
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
虽然我不推荐,但是你可以通过继承types.ModuleType
来构建你自己的模块。然后,您可以用自定义的 class 和 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