__eq__ - __getitem__ python
¿Cómo anulo correctamente__setattr__ y__getattribute__ en las clases de estilo nuevo en Python? (2)
Sus
super(ABCImmutable, self).__setattr__(name, value)
en Python 2, o
super().__setattr__(name, value)
en Python 3.
Además, elevar AttributeError
no es la forma de volver al comportamiento predeterminado para __getattribute__
. Vuelves al valor predeterminado con
return super(ABCImmutable, self).__getattribute__(name)
en Python 2 o
return super().__getattribute__(name)
en Python 3.
Raising AttributeError
omite el tratamiento predeterminado y va a __getattr__
, o simplemente produce un AttributeError
en el código de llamada si no hay __getattr__
.
Consulte la documentación sobre Personalización de acceso de atributo .
Quiero anular los métodos __getattribute__
y __setattr__
mi clase Python. Mi caso de uso es el habitual: tengo algunos nombres especiales que quiero manejar, y quiero el comportamiento predeterminado para cualquier otra cosa. Para __getattribute__
, parece que puedo solicitar el comportamiento predeterminado simplemente levantando AttributeError
. 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 antiguas, la respuesta aparentemente fue self.__dict__[name] = value
, pero la documentación indica que esto es incorrecto para las clases de estilo nuevo.
SomeSuperclass.__setattr__(self, name, value)
?