Повторно читая этот вопрос, я неправильно понял, о чем @ 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
- и т.д.