2015-09-15 12 views
5

Tworzę moduł, który chcę traktować jako statyczny kontener obiektów. Te obiekty są typu klasy, które zdefiniowałem. Chcę móc zaimportować ten moduł, a następnie zapętlić obiekty wewnątrz. Oto kod wyjaśniając o co mi chodzi:Czy możliwe jest wykonanie modułu w języku Python?

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) 

Następnie chciałbym, aby móc importować ten i używać go jak ENUM:

import example 

for e in example: 
    # do stuff with e 

Is to można zrobić w Pythonie? Czy będę musiał zaimportować listę z pakietu example?

example.py

objects = (instanceA, instanceB, instanceC) 

a następnie

import example 

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

Drugie rozwiązanie na pewno działa. Dlaczego jej nie użyć? – mdurant

+2

lub jeśli nie podoba ci się ta wersja z jakiegoś powodu, odpowiednik 'z przykładu importuje obiekty; dla e w obiektach: '... –

+1

Prawdopodobnie możesz to zrobić, jeśli wpychasz jakiś obiekt do sys.modules, który ma odpowiedni interfejs API dla iteracji. Nie jestem pewien, czy musiałby on pochodzić z 'ModuleType'. – schlenk

Odpowiedz

3

Można to osiągnąć poprzez zdefiniowanie klasy głównego w module i wymianie modułu z instancji tej klasy. Oto przykład:

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

Tak więc możesz robić, co chcesz, ponieważ podczas importowania tego modułu, to rzeczywiście być instancją swoim zwyczajem iterowalny ModuleClass:

import example 

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

To nie działa, jeśli próbuję zaimportować 'example' w dwóch osobnych plikach; pierwszy plik poprawnie myśli 'przykład' jest instancją' ModuleClass' ale drugi plik nadal myśli 'przykład' jest modułem – ahuff44

+0

Hmm ciekawe, czy możesz opublikować błędy? – bagrat

+0

My bad; Musiałem popełnić błąd. Kiedy stworzyłem nowy projekt, aby to przetestować, błędy zniknęły – ahuff44

3

Choć robię nie polecam, możesz zbudować własny moduł dziedzicząc po types.ModuleType. Możesz następnie zastąpić oryginalny moduł niestandardową klasą przez 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

Po prostu Ugh .... Widzę, dlaczego nie jest to zalecane. –

Powiązane problemy