45

__getattribute__Python のクラスと__setattr__メソッドをオーバーライドしたいと考えています。私の使用例は通常のものです。処理したい特別な名前がいくつかあり、それ以外はデフォルトの動作が必要です。について__getattribute__は、 を上げるだけでデフォルトの動作を要求できるようですAttributeError。しかし、どうすれば同じことを達成でき__setattr__ますか? これは、不変フィールド「A」、「B」、および「C」を持つクラスを実装する簡単な例です。

class ABCImmutable(SomeSuperclass):
    def __getattribute__(self, name):
        if name in ("A", "B", "C"):
            return "Immutable value of %s" % name
        else:
            # This should trigger the default behavior for any other
            # attribute name.
            raise AttributeError()

    def __setattr__(self, name, value):
        if name in ("A", "B", "C"):
            raise AttributeError("%s is an immutable attribute.")
        else:
            # How do I request the default behavior?
            ???

疑問符の代わりに何が入りますか? 古いスタイルのクラスでは、答えは明らかself.__dict__[name] = valueに でしたが、ドキュメントによると、新しいスタイルのクラスではこれが間違っていることが示されています。

4

2 に答える 2

49

これは

super(ABCImmutable, self).__setattr__(name, value)

Python 2の場合、または

super().__setattr__(name, value)

Python3で。

また、レイズAttributeErrorは、のデフォルトの動作にフォールバックする方法ではありません__getattribute__。デフォルトにフォールバックします

return super(ABCImmutable, self).__getattribute__(name)

Python2または

return super().__getattribute__(name)

Python3で。

RaisingAttributeErrorはデフォルトの処理をスキップして、に移動します。またはがない場合は、呼び出し元のコードにを__getattr__生成します。AttributeError__getattr__

属性アクセスのカスタマイズに関するドキュメントを参照してください。

于 2011-08-12T15:15:32.020 に答える
6

SomeSuperclass.__setattr__(self, name, value)?

于 2011-08-12T15:12:30.147 に答える