クラス内のマジックメソッド__getattr__
をオーバーライドすると、属性が見つからない場合にのみオーバーライドされたメソッドが呼び出されます。それ以外の場合はデフォルトの動作が発生します。属性が存在しない場合のみ__setattr__
しかし、これは__setattr__
の場合とは異なり、すべての属性に影響します。
私が探しているのは、属性が存在するときに正常に動作し、属性が存在しないときにカスタムコードに従うものです。そして、にはどのようにしてsuper
が呼び出されますか?
クラス内のマジックメソッド__getattr__
をオーバーライドすると、属性が見つからない場合にのみオーバーライドされたメソッドが呼び出されます。それ以外の場合はデフォルトの動作が発生します。属性が存在しない場合のみ__setattr__
しかし、これは__setattr__
の場合とは異なり、すべての属性に影響します。
私が探しているのは、属性が存在するときに正常に動作し、属性が存在しないときにカスタムコードに従うものです。そして、にはどのようにしてsuper
が呼び出されますか?
カスタム__getattr__
を使用して、属性が存在するかどうかを知ることができます。デフォルトの動作で、you do something likeで属性を設定するには
:
object.__setattr__(self, name, value)
class ClassName(object):
def __setattr__(self, name, value)
if hasattr(self, name):
super(ClassName, self).__setattr__(name, value)
else:
magic
'hasattr'は' __getattr__'と相談します。つまり '__dict__'や' __slots__'などに本当にそのような属性があるかどうかはチェックしません。 – delnan
確かに、それは私がそれを理解している限り問題の範囲内にはありませんでした。 –
まあ、そう「正常に動作」とそうでない場合は、あなたの魔法を追加する場合、属性が既に存在だかどうかを確認する '__setattr__'を定義しますか? – delnan