2010-10-13 19 views
8

Czy można przeciążyć instrukcję z/import w Pythonie?Czy można przeładować z/importować w Pythonie?

Na przykład, zakładając jvm_object jest instancją klasy JVM, jest to możliwe, aby napisać ten kod:

class JVM(object): 

    def import_func(self, cls): 
    return something... 

jvm = JVM() 

# would invoke JVM.import_func 
from jvm import Foo 
+3

Dlaczego? czy kiedykolwiek to zrobiłeś? –

+0

@ S.Lott Zasadniczo chcę zaimportować pakiety i klasy ze zdalnej maszyny JVM (w programie Python) i chociaż mogę podać metodę importowania, chciałbym ponownie użyć składni Pythona. – Barthelemy

+0

"import pakietów i klas ze zdalnej maszyny JVM"? Nie plik? Jak to zadziała? Jak zarządzać tworzeniem plików .pyc? Co jest nie tak z "plikami"? Działają naprawdę dobrze. Co jest złego w zdalnym montowaniu systemu plików? To działa naprawdę dobrze. –

Odpowiedz

7

This post pokazuje, jak korzystać z funkcjonalności wprowadzone w PEP-302 importować moduły w sieci. Zamieszczam to jako przykład, jak dostosować instrukcję importu, a nie sugerowane użycie;)

+0

Dzięki, działa dobrze! – Barthelemy

3

Trudno jest znaleźć coś, co nie jest możliwe w dynamicznym języku, takim jak Python, ale czy naprawdę musimy nadużywać wszystkiego? W każdym razie, to jest tutaj:

from types import ModuleType 
import sys 

class JVM(ModuleType): 
    Foo = 3 

sys.modules['JVM'] = JVM 

from JVM import Foo 
print Foo 

Ale jeden wzór Widziałem w kilku bibliotekach/projektów jest jakiś rodzaj _make_module() funkcji, która tworzy ModuleType dynamicznie i inicjalizuje wszystko w nim. Następnie bieżący moduł zostanie zastąpiony przez nowy moduł (przy użyciu przypisania do sys.modules) i funkcja _make_module() zostanie usunięta. Zaletą tego jest to, że możesz przechodzić przez moduł, a nawet dodawać obiekty do modułu wewnątrz tej pętli, co jest czasami bardzo przydatne (ale używaj go z ostrożnością!).

Powiązane problemy