Как правильно переопределить __setattr__ и __getattribute__ в классах нового стиля в Python?

Я хочу переопределить __ getattribute __ и моего класса Python. ] __ setattr __ методы. Мой вариант использования обычный: у меня есть несколько специальных имен, которые я хочу обработать, и мне нужно поведение по умолчанию для всего остального. Для __ 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 , но в документации указано, что это неверно для классов нового стиля.

38
задан Ryan C. Thompson 4 November 2016 в 23:26
поделиться