magic __getitem__ __eq__ python python-3.x inheritance python-2.x setattr

__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) ?