##
3.3.2 属性値アクセスをカスタマイズする

以下のメソッドを定義して、クラスインスタンスへの属性値アクセス ( 属性値の使用、属性値への代入、`x.name` の削除) の意味を カスタマイズすることができます。

`__getattr__`( | self, name)

  属性値の検索を行った結果、通常の場所に属性値が見つからなかった 場合 (すなわち、`self` のインスタンス属性でなく、かつクラスツリー にも見つからなかった場合) に呼び出されます。 このメソッドは (計算された) 属性値を返すか、`AttributeError` 例外を送出しなければなりません。

  通常のメカニズムを介して属性値が見つかった場合、`__getattr__()` は呼び出されないので注意してください。(`__getattr__()` と `__setattr__()` の間は意図的に非対称性にされています。 これは`__getattr__()` および `__setattr__()` 双方に とっての効率性という理由と、こうしなければ `__setattr__()` がインスタンスの他の属性値にアクセスする方法がなくなるためです。 少なくともインスタンス変数に対しては、値をインスタンスの属性値 辞書に挿入しないようにして (代わりに他のオブジェクトに挿入することで) 属性値が完全に制御されているように見せかけられることに注意してください。 新形式のクラスで実際に完全な制御を行う方法は、以下の `__getattribute__()` メソッドを参照してください。

`__setattr__`( | self, name, value)

  属性値への代入が試みられた際に呼び出されます。このメソッドは 通常の代入メカニズム (すなわち、インスタンス辞書への値の代入) の代わりに呼び出されます。 name は属性名で、value はその属性に代入する値です。

  `__setattr__()` の中でインスタンス属性値への代入が必要 な場合、単に "`self.name = value`" としてはなりません -- このようにすると、自分自身に対する再帰呼び出しがおきてしまいます。 その代わりに、インスタンス属性の辞書に値を挿入してください。 例えば、"`self.__dict__[name] = value`" とします。 新しい形式のクラスでは、インスタンス辞書にアクセスするのではなく、 基底クラスのメソッドを同じ属性名で呼び出します。例えば、 "`object.__setattr__(self, name, value)`" とします。

`__delattr__`( | self, name)

  `__setattr__()` に似ていますが、代入ではなく値の削除を 行います。このメソッドを実装するのは、オブジェクトにとって "`del obj.name`" が意味がある場合だけにしなければなりません。