¿Cómo anulo correctamente __setattr__ y __getattribute__ en clases de estilo nuevo en Python?
Quiero anular mi clase de Python__getattribute__
y__setattr__
métodos. Mi caso de uso es el habitual: tengo algunos nombres especiales que quiero manejar, y quiero el comportamiento predeterminado para cualquier otra cosa. Por__getattribute__
, parece que puedo solicitar el comportamiento predeterminado simplemente elevandoAttributeError
. Sin embargo, ¿cómo puedo lograr lo mismo en__setattr__
? Aquí hay un ejemplo trivial, implementando una clase con campos inmutables "A", "B" y "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?
???
¿Qué pasa en lugar de los signos de interrogación? Con las clases de estilo antiguo, la respuesta fue aparentementeself.__dict__[name] = value
, pero la documentación indica que esto es incorrecto para las clases de estilo nuevo.