2015-09-15 18 views
5

Ich mache ein Modul, das ich als statischen Container von Objekten behandeln möchte. Diese Objekte gehören zu einem von mir definierten Klassentyp. Ich möchte in der Lage sein, dieses Modul zu importieren und dann die darin enthaltenen Objekte zu durchlaufen. Hier ist ein Code zu erklären, was ich meine:Ist es möglich, ein Modul in Python iterierbar zu machen?

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) 

Dann würde ich diese in der Lage sein möchte zu importieren und es wie ein Enum zu verwenden:

import example 

for e in example: 
    # do stuff with e 

Ist das ist in Python möglich? Oder muss ich eine Liste aus dem example Paket importieren?

example.py

objects = (instanceA, instanceB, instanceC) 

und dann

import example 

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

ersetzen Die zweite Lösung funktioniert sicherlich. Warum nicht benutzen? – mdurant

+2

oder wenn Sie diese Version aus irgendeinem Grund nicht mögen, das Äquivalent von Beispiel importieren Objekte; für e in Objekten: '... –

+1

Sie könnten es wahrscheinlich tun, wenn Sie ein Objekt in sys.modules stopfen, das die richtige API für die Iteration hat. Nicht sicher, ob es von 'ModuleType abgeleitet werden müsste. – schlenk

Antwort

3

Sie, dass durch die Definition einer Stammklasse in Ihrem Modul und ersetzen Sie das Modul mit einer Instanz dieser Klasse erreichen kann. Hier ein Beispiel:

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() 

So können Sie tun, was Sie wollen, denn wenn Sie das Modul importieren, wird es tatsächlich eine Instanz des benutzerdefinierten sein iterable ModuleClass:

import example 

for e in example: 
    # do stuff with e 
+0

Das scheint nicht zu funktionieren, wenn ich versuche, 'example' in zwei separate Dateien zu importieren; die erste Datei denkt korrekt "Beispiel" ist eine Instanz von 'ModuleClass', aber die zweite Datei denkt immer noch' Beispiel' ist ein Modul – ahuff44

+0

Hmm interessant, können Sie einige Fehler posten? – bagrat

+0

Mein schlechtes; Ich muss einen Fehler gemacht haben. Als ich ein neues Projekt erstellte, um das zu testen, waren die Fehler weg – ahuff44

3

Obwohl ich tun nicht zu empfehlen, können Sie Ihr eigenes Modul erstellen, indem Sie von types.ModuleType erben. Sie können dann das ursprüngliche Modul durch Ihre benutzerdefinierte Klasse mit 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

Nur Ugh .... Ich kann sehen, warum es nicht empfohlen wird. –

Verwandte Themen