2010-12-19 5 views
5

Ich versuche, ein Modul zu importieren, aber nur wenn ein Objekt einer bestimmten Klasse aufgerufen wird. Zum Beispiel:Python importieren ein Modul nur in eine Klasse

class One(object): 
    try: 
     import OneHelper 
    except ImportError: 
     pass 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     # this function does 
     OneHelper.blah() 

Dies führt zu einem NameError: global name 'OneHelper' is not defined, wenn die One.blah() Funktion aufgerufen wird. Bis jetzt ist das Einzige, was ich gefunden habe, das funktioniert, das Modul in die eigentlichen Funktionen zu importieren, die es benutzen. Also:

class One(object): 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     try: 
      import OneHelper 
     except ImportError: 
      pass 
     # this function does 
     OneHelper.blah() 

Aber ich will nicht das Modul in jeder Funktion will ich es habe importieren in verwenden, ich will es die ganze Klasse zur Verfügung stehen, aber nur wenn eine Instanz Diese Klasse wird instanziiert. Entschuldigung, wenn ich nicht klar genug bin ...

+0

Sie könnten versuchen, eine Funktion zu erstellen, die die Klasse importiert, wenn sie instanziiert wird, und dann die Funktion nur innerhalb der anderen Funktionen aufruft. Kleiner Workaround vielleicht. –

Antwort

8

Die import OneHelper funktioniert gut in der Klasse, so dass es ein Klassenattribut. Sie können dies nach der Definition Ihrer Klasse mit dir(One) überprüfen - dort ist Ihr OneHelper Attribut. One.OneHelper ist eine Referenz auf das Modul. In einer Instanz können Sie natürlich von Ihren Methoden aus auf self.OneHelper zugreifen. (Man könnte es auch weiterhin als One.OneHelper zuzugreifen.)

+0

natürlich, jetzt fühle ich mich dumm lol:/danke für die einsicht! –

+0

Fühlen Sie sich nicht dumm ... es ist vollkommen vernünftig anzunehmen, dass 'import' immer in den globalen Namespace des Moduls importiert, weil dies in 99,44% der Fälle geschieht. Natürlich funktioniert das nicht so, aber es ist kein unangemessener Ausgangspunkt. Ich musste es selbst testen, um sicher zu sein, wie es sich verhält. Zum Glück, wenn Sie nicht sicher sind, ein wenig Experimentieren und Inspizieren wird Sie in Python weit bringen. – kindall

2

Import es auf __init__ und Attribut zu einer Eigenschaft:

class One(object): 
    def __init__(self): 
     try: 
      import OneHelper 
     except ImportError: 
      self.OneHelper = None 
     else: 
      self.OneHelper = OneHelper 
    def blah(self): 
     if self.OneHelper: 
      self.OneHelper.blah() 

Ihr Beispiel sieht komisch aus, weil, wenn das Modul zu importieren, schlägt fehl, was ist der Punkt des Aufrufs es später?

+0

+1 Sie sollten fast nie eine Ausnahme abfangen und nichts im 'except' Block machen, und das gilt doppelt für' ImportError', das Sie fast nie fangen sollten (d. H. Nur wenn Sie einen Fallback haben). –

0

Sie könnten auch vor dem Importieren des Moduls die Verwendung von global OneHelper in Erwägung ziehen. Dadurch wird der OneHelper dem globalen Namespace hinzugefügt.

Verwandte Themen