2011-06-28 8 views
2

クラス内のマジックメソッド__getattr__をオーバーライドすると、属性が見つからない場合にのみオーバーライドされたメソッドが呼び出されます。それ以外の場合はデフォルトの動作が発生します。属性が存在しない場合のみ__setattr__

しかし、これは__setattr__の場合とは異なり、すべての属性に影響します。

私が探しているのは、属性が存在するときに正常に動作し、属性が存在しないときにカスタムコードに従うものです。そして、にはどのようにしてsuperが呼び出されますか?

+5

まあ、そう「正常に動作」とそうでない場合は、あなたの魔法を追加する場合、属性が既に存在だかどうかを確認する '__setattr__'を定義しますか? – delnan

答えて

2

カスタム__getattr__を使用して、属性が存在するかどうかを知ることができます。デフォルトの動作で、you do something likeで属性を設定するには

object.__setattr__(self, name, value) 
4
class ClassName(object): 
    def __setattr__(self, name, value) 
     if hasattr(self, name): 
      super(ClassName, self).__setattr__(name, value) 
     else: 
      magic 
+2

'hasattr'は' __getattr__'と相談します。つまり '__dict__'や' __slots__'などに本当にそのような属性があるかどうかはチェックしません。 – delnan

+0

確かに、それは私がそれを理解している限り問題の範囲内にはありませんでした。 –

関連する問題