Я хочу переопределить методы класса __getattribute__
и __setattr__
класса Python. Мой вариант использования является обычным: у меня есть несколько специальных имен, которые я хочу обработать, и я хочу, чтобы поведение по умолчанию было чем-то еще. Для __getattribute__
кажется, что я могу запросить поведение по умолчанию, просто подняв AttributeError
. Однако как я могу добиться того же в __setattr__
? Вот тривиальный пример, реализующий класс с неизменяемыми полями "A", "B" и "C".
class ABCImmutable(SomeSuperclass):
def __getattribute__(self, name):
if name in ("A", "B", "C"):
return "Immutable value of %s" % name
else:
# This should trigger the default behavior for any other
# attribute name.
raise AttributeError()
def __setattr__(self, name, value):
if name in ("A", "B", "C"):
raise AttributeError("%s is an immutable attribute.")
else:
# How do I request the default behavior?
???
Что происходит вместо вопросительных знаков? В классах старого стиля ответ был явно self.__dict__[name] = value
, но документация указывает, что это неправильно для классов нового стиля.