2016-05-03 11 views
-2

Ich habe eine Protokollierungsklasse, die das Hinzufügen eines Präfixes zu den Protokollen ermöglicht. Wenn kein Präfix angegeben ist, sollte standardmäßig "" angegeben werden.Python: AttributeError beim Überprüfen, ob Eigenschaften vorhanden sind

class PrefixedLog(Loggable): 
    def __init__(self): 
     self._prefix = None 

    @property 
    def prefix(self): 
     if self._prefix: 
      return self._prefix 
     else: 
      return "" 

    @prefix.setter 
    def prefix(self, value): 
     self._prefix = value 

    @property 
    def log(self): 
     if not hasattr(self, '_log') or not self._log: 
      log = logging.getLogger(self.__class__.__name__) 
      self._log = LoggerAdapter(self._prefix, log) 
     return self._log 

Ich habe eine andere Klasse, die dann ein Objekt einer anderen Klasse erstellt, wo ich versuche, das Präfix zu setzen:

class A(PrefixedLog): 
    def __init__(self, **kwargs): 
     super(A, self).__init__(**kwargs) 
     self.b = B() 

Die Klasse mit dem Präfix:

class B(PrefixedLog): 
    self.another_class = AnotherClass() 
    if self.prefix: 
     self.another_class.prefix = 'desired prefix' 

Ich erhalte diesen Fehler:

AttributeError: 'B' object has no attribute '_prefix' 

auf dem

if self.prefix: 

Linie.

Ich habe schon nach Lösungen gesucht, aber die meisten hatten mit Formatierungsproblemen zu tun ... Ich habe sichergestellt, dass es keine Tabs gibt. Irgendwelche Ideen, was das Problem sein könnte? Danke im Voraus.

Auch - ich möchte sicherstellen, dass auch wenn eine Klasse nicht speziell ein Präfix setzt, dann das Präfix standardmäßig "" ohne Fehler, dh ich muss nicht zurück zu jeder Klasse, die ich habe und setze das Präfix.

+1

[ 'hasattr'] (https://docs.python.org/2/library/functions.html?highlight=hasattr#hasattr)((self, "_prefix") ' –

+1

Müssen Sie nicht super aufrufen, da das Präfix eine Eigenschaft des Elternteils ist ? – Chris

Antwort

-3

Wenn Sie schreiben self._prefix es den Wert des Attributs abruft, wenn das Attribut nicht existiert es ein AttributeError wirft. In diesem Fall möchten Sie zu überprüfen, ob das Attribut vorhanden ist oder nicht das ist, was hasattr ist für:

if hasattr(self,"_prefix"): 
    return self._prefix 
else: 
    return '' 

Dies kann jedoch für mit einem Fehlerwert verkürzt werden getattr

return getattr(self,"_prefix", '') 
+0

Vielen Dank, das hat funktioniert !! – Oreo

+0

@RJ nachdem ich die Antwort von JustinBuchanan gesehen habe und bemerke, dass du tatsächlich 'self._prefix = None' initialisierst, aber niemals diese super Methode anrufst, würde ich erwarten, dass dies das falsche Ergebnis ergibt, wenn du eine Instanz von 'A' machst (self.prefix -> Keine) –

5

Meinst du, den Code in Klasse B innerhalb einer __init__() Methode zu setzen? Ich denke, diesen Code:

class B(PrefixedLog): 
    self.another_class = AnotherClass() 
    if self.prefix: 
     self.another_class.prefix = 'desired prefix' 

geändert werden sollte:

class B(PrefixedLog): 
    def __init__(self): 
     super().__init__() 
     self.another_class = AnotherClass() 
     if self.prefix: 
      self.another_class.prefix = 'desired prefix' 
+2

Sie müssten '' super() 'trotzdem aufrufen, bevor Sie' self.prefix' überprüfen. –

+1

Das war eindeutig ein Tippfehler, sonst wäre der Fehler "NameError: Name" self "ist nicht definiert" –

+0

Danke! habe es gerade bearbeitet. –