2015-09-15 8 views
5

私はオブジェクトの静的コンテナとして扱いたいモジュールを作っています。これらのオブジェクトは、私が定義したクラス型です。私はこのモジュールをインポートし、その中のオブジェクトをループすることができます。ここで私が何を意味するかを説明するいくつかのコードは次のとおりです。Pythonでモジュールを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 
+3

2番目の解決策は確実に機能します。なぜそれを使用しない? – mdurant

+2

または何らかの理由でそのバージョンが気に入らなければ、同等の 'from example import objects; '... –

+1

イテレーションのための適切なAPIを持つsys.modulesにオブジェクトを埋め込むと、おそらくそれを行うことができます。 'ModuleType.'から派生する必要があるかどうか分かりません。 – schlenk

答えて

3

あなたのモジュールにルートクラスを定義し、そのクラスのインスタンスでモジュールを交換することにより、それを達成することができます。次に例を示します。

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 
+0

2つの別々のファイルに 'example'をインポートしようとするとこれはうまくいかないようです。最初のファイルは 'example'が' ModuleClass'のインスタンスであると正しく思っていますが、2番目のファイルは 'example'がモジュールだとまだ考えています – ahuff44

+0

面白いですが、 – bagrat

+0

私の悪い;私は間違いをしたに違いない。これをテストするための新しいプロジェクトを作成したときに、エラーが発生しました – ahuff44

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 
+0

私はそれがお勧めしていない理由がわかります。 –

関連する問題