El tipo object
es una clase incorporada escrito en C y no le permiten agregar atributos a la misma. Se ha codificado expresamente para evitarlo.
La manera más fácil de obtener el mismo comportamiento en sus propias clases es usar el atributo __slots__
para definir una lista de los atributos exactos que desea admitir. Python reservará espacio solo para esos atributos y no permitirá otros.
class c(object):
__slots__ = "foo", "bar", "baz"
a = c()
a.foo = 3 # works
a.b = 3 # AttributeError
Por supuesto, hay algunas advertencias con este enfoque: no se puede conservar en vinagre tales objetos, y el código que se espera que cada objeto que tiene un atributo __dict__
se romperá. Una forma "más Pythonic" sería usar un __setattr__()
personalizado como se muestra en otro póster. Por supuesto, hay muchas formas de evitarlo y no hay manera de establecer __slots__
(además de la creación de subclases y la adición de sus atributos a la subclase).
En general, esto no es algo que realmente deba hacer en Python. Si el usuario de su clase desea almacenar algunos atributos adicionales en las instancias de la clase, no hay razón para no permitirlos, y de hecho hay muchas razones por las que podría querer.
'¿Cómo puedo hacer que mis clases tengan solo propiedades definidas?' - Cabe señalar que esto es solo un montón de trabajo adicional sin una buena razón y tal vez romper alguna pieza útil de metaprogramación, por lo que debe evitarse a menos que tenga buenas razones para hacer esto y sepa exactamente lo que está haciendo. – delnan