13

object.__setattr__から継承されていないオブジェクトを呼び出すことはできないことは知っていますがobject、他に何か違いはありますか?これが重要な場合、私はPython2.6で作業しています。

4

1 に答える 1

17

この質問をもう一度読んで、@ paper.cutが何を求めているのかを誤解しました。クラシッククラスと新しいスタイルのクラスの違いです(Python 3以降の問題ではありません)。その答えはわかりません。


元の回答*

setattr(instance, name, value)instance.__setattr__(name, value)**のシンタックスシュガーです。

object.__setattr__(...)クラス定義内で呼び出す必要があるのは、直接サブクラス化する場合のみです。たとえば、object他の何かをサブクラス化する場合は、を使用して階層内の次のアイテムを取得するか、この方法で呼び出す必要があります。スーパークラスが直接スキップして定義した動作を見逃すリスクを冒さないでください。Spamsuper()Spam.__setattr__(...)object


* Python3.0以降のクラスと2.xの新しいスタイルのクラスに適用されます


**setattr(x, ...)x.__setattr__(...)が同じでない場合が2つあります。

  • xそれ自体が__setattr__プライベート辞書にあります(したがってx.__dict__[__setattr__] = ...(これはほぼ間違いなくエラーです)

  • x.__class__メソッドがあり__getattribute__ます-メソッド/属性が存在する場合でも、すべてのルックアップを__getattribute__インターセプトするため

注意 :これらの2つの警告は、すべてのシンタックスシュガーショートカットに適用されます。

  • setattr
  • getattr
  • len
  • bool
  • hash
于 2011-09-26T18:10:05.487 に答える