2015-06-15 17 views
6

Tworzę moduł z kilkoma klasami. Mój problem polega na tym, że niektóre z tych klas muszą importować bardzo specyficzne moduły, które muszą być ręcznie skompilowane lub wymagają specjalnego sprzętu do pracy.Import na instancję klasy

Nie ma żadnego interesu w importowaniu każdego konkretnego modułu z góry, a ponieważ niektóre moduły wymagają specjalnego sprzętu do pracy, może on nawet powodować błędy.

Chciałbym wiedzieć, czy jest możliwe, aby zaimportować te moduł tylko wtedy, gdy potrzebne, czyli na konkretyzacji precyzyjnej klasy, tak jak poniżej:

class SpecificClassThatNeedRandomModule(object): 
    import randomModule 

Również nie jestem pewien, że będzie to dobry pythonowy sposób robienia trików, więc jestem otwarty na sugestie w odpowiedni sposób.

+3

Nie sądzę, umieszczając instrukcję import w definicji klasy będzie go opóźnić jak można się spodziewać. Możesz jednak dokonać importu w funkcji, a wtedy zdarzy się to tylko przy pierwszym wywołaniu tej funkcji. –

+2

Sprawdź również [jak przetestować, czy jeden moduł python został zaimportowany?] (Http://stackoverflow.com/questions/5027352/how-to-test-if-one-python-module-has-been-implikowany). Dobre rzeczy istnieją na tych postach. – FallenAngel

Odpowiedz

4

Możliwe jest importowanie modułu w instancji:

class SpecificClassThatNeedRandomModule(object): 
    def __init__(self): 
     import randomModule 
     self.random = randomModule.Random() 

Jest to jednak zła praktyka, ponieważ sprawia, że ​​trudno jest się dowiedzieć, kiedy import został wykonany. Może chcesz zmodyfikować moduł tak, że nie wyjątek, albo złapać ImportError:

try: 
    import randomModule 
except ImportError: 
    randomModule = None 
+0

Chociaż to * może * być kiepską praktyką; Uważam, że PO próbuje jedynie importować moduły, które rzeczywiście są potrzebne lub używane per se. Ale +1 na "dobrą praktykę". –

+0

@PadraicCunningham Nie mogłeś. Musiałbyś zrobić: '' if randomModule: '' –

3

Będziemy chcieli "import" w konstruktorze klasy:

Przykład:

class SpecificClassThatNeedRandomModule(object): 

    def __init__(self, *args, **kwargs): 
     import randomModule 

     self.randomModule = randomModule # So other methods can reference the module! 
+1

Masz rację, ale musisz dodać 'self.randomModule = randomModule', jeśli chcesz użyć swojego modułu w innej funkcji instancji. Dzięki za odpowiedź! – CoMartel

Powiązane problemy