В чем разница между setattr () и object .__ setattr __ ()? - PullRequest
10 голосов
/ 26 сентября 2011

Я знаю, что вы не можете вызвать object.__setattr__ для объектов, не унаследованных от object, но есть ли что-то еще, что отличается между этими двумя? Я работаю в Python 2.6, если это имеет значение.

1 Ответ

14 голосов
/ 26 сентября 2011

Повторно читая этот вопрос, я неправильно понял, о чем @ paper.cut спрашивал: разницу между классическими классами и классами нового стиля (не проблема в Python 3+). Я не знаю ответа на этот вопрос.


Оригинальный ответ *

setattr(instance, name, value) является синтаксическим сахаром для instance.__setattr__(name, value)**.

Вам нужно будет только вызвать object.__setattr__(...) внутри определения класса, и только в том случае, если непосредственно подклассифицируется object - если вы подклассифицируете что-то еще, например, Spam, тогда вы должны использовать super() получить следующий элемент в иерархии или вызвать Spam.__setattr__(...) - таким образом, вы не рискуете пропустить поведение, определенное суперклассами, пропуская их непосредственно до object.


* применяется к классам Python 3.0+ и классам нового стиля 2.x


** В двух случаях setattr(x, ...) и x.__setattr__(...) не совпадают:

  • x само по себе имеет __setattr__ в своем частном словаре (поэтому x.__dict__[__setattr__] = ... (это почти наверняка ошибка)

  • x.__class__ имеет метод __getattribute__ - потому что __getattribute__ перехватывает каждый поиск, даже когда метод / атрибут существует

NB Эти два предостережения относятся к каждому синтаксическому ярлыку сахара:

  • setattr
  • getattr
  • len
  • bool
  • hash
  • и т.д.
...