以下のメソッドを定義して、クラスインスタンスへの属性値アクセス (
属性値の使用、属性値への代入、x.name
の削除) の意味を
カスタマイズすることができます。
self, name) |
self
のインスタンス属性でなく、かつクラスツリー
にも見つからなかった場合) に呼び出されます。
このメソッドは (計算された) 属性値を返すか、AttributeError
例外を送出しなければなりません。
通常のメカニズムを介して属性値が見つかった場合、__getattr__() は呼び出されないので注意してください。(__getattr__() と __setattr__() の間は意図的に非対称性にされています。 これは__getattr__() および __setattr__() 双方に とっての効率性という理由と、こうしなければ __setattr__() がインスタンスの他の属性値にアクセスする方法がなくなるためです。 少なくともインスタンス変数に対しては、値をインスタンスの属性値 辞書に挿入しないようにして (代わりに他のオブジェクトに挿入することで) 属性値が完全に制御されているように見せかけられることに注意してください。 新スタイルクラスで実際に完全な制御を行う方法は、以下の __getattribute__() メソッドを参照してください。
self, name, value) |
__setattr__() の中でインスタンス属性値への代入が必要 な場合、単に "self.name = value" としてはなりません -- このようにすると、自分自身に対する再帰呼び出しがおきてしまいます。 その代わりに、インスタンス属性の辞書に値を挿入してください。 例えば、"self.__dict__[name] = value" とします。 新しい形式のクラスでは、インスタンス辞書にアクセスするのではなく、 基底クラスのメソッドを同じ属性名で呼び出します。例えば、 "object.__setattr__(self, name, value)" とします。
self, name) |