6

投稿を読んでいたところPython で __dict__ を介して新しいクラス属性を割り当てるにはどうすればよいですか? @bruno desthuilliers から次のようなコメントがありました。

魔法のメソッドを直接呼び出すべきではありません - それらは演算子または汎用関数の実装としてここにあります。この場合、慣用的な解決策は を使用することsetattr(obj, name, value)です。

setattr のケースは、彼自身のコメントの範囲外のようです: 演算子ではなく、実際にはジェネリック関数の実装でもありません。

誰かがコメントを説明できますか?どちらかを優先する必要があるのはなぜですか?

どのような場合に使用するのが望ましいobj.__setattr__(name, value)ですか?

4

1 に答える 1

16

常に使用する必要setattr()があります。コメンターは非常に正しいです。

__setattr__たとえば、すべてのタイプが を実装しているわけではありませんsetattr()が、そのタイプで属性の設定が許可されていれば、正しく機能します。

二重下線メソッドはフックであり、カスタム クラスがカスタム動作を実装できるようにします。Python API は、これらのフックが存在する場合はそれを使用し、フックが欠落している場合はデフォルトの動作にフォールバックします。API をバイパスすると、独自のコードにフォールバックを実装しなければならないという負担が生じます。

サブクラスを実装するときに直接呼び出す必要があるだけで__setattr__、できれば呼び出しを介してsuper()呼び出す必要があります。

def Foo(Bar):
   def __setattr__(self, attr, value):
       # do something with attr and value
       super(Foo, self).__setattr__(attr, value)
于 2013-02-07T16:46:49.793 に答える