2016-05-03 13 views
-2

ログにプレフィックスを追加できるようにするログクラスがあります。プレフィックスが指定されていない場合、デフォルトで ""に設定されます。Python:プロパティが存在するかどうかをチェックする際のAttributeError

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 

私はその後、私は接頭辞を設定しようとしている別のクラスのオブジェクトを作成し、別のクラスを、持っている:

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

接頭辞を持つクラス:

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

このエラーが発生します:

AttributeError: 'B' object has no attribute '_prefix' 
上の
if self.prefix: 

行。

解決策は既に検索されていますが、ほとんどの場合、問題の書式設定と関連があります...タブがないことを確認しました。問題が何であるかについてのアイデアはありますか?前もって感謝します。

また、クラスがプレフィックスを特に設定していない場合でも、接頭辞はデフォルトでエラーなしに行われます。つまり、私が持っているすべてのクラスに戻る必要はありません。プレフィックスを設定します。

+1

のフォールバック値[ 'hasattr']を短縮することができます。この場合、あなたは何のためhasattrである属性が存在するかどうかをチェックするかしないかにしたいです(https://docs.python.org/2/library/functions.html?highlight=hasattr#hasattr)'(self、 "_prefix") ' –

+1

接頭辞は親のプロパティであるため、superを呼び出す必要はありませんか? – Chris

答えて

-3

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

をに変更する必要があります。

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

しかし、これはgetattr

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

ありがとうございました! – Oreo

+0

@RJ JustinBuchananの答えを見て、あなたが 'self._prefix = None'を実際に初期化していることに気づいたが、そのスーパーメソッドを呼び出すことは決してなかった。' A'のインスタンスを作ると、 - >なし) –

5

__init__()メソッドの内部にコードBを挿入することを意味しましたか?私はこのコードを考える:あなたはself._prefixを書くときの属性は、それがAttributeErrorを提起存在しない場合には、属性の値を取得

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

'self.prefix'をチェックする前に' super() 'を呼び出す必要があります。 –

+1

これは明らかにタイプミスでした。そうでなければ、エラーは 'NameError:name 'self' is not defined'となります。 –

+0

ありがとう!ちょうどそれを編集しました。 –

関連する問題