Pregunta sobre clases

Hernan Martínez Foffani hernan en orgmf.com.ar
Sab Jul 30 12:07:08 CEST 2005


> Estoy empezando a programar en Python y veo un comportamiento que me
> parece extraño:
>
> Supongamos una clase:
>
> class Prueba:
>     def __init__(self):
>         self.dato1 = 1
>         self.dato2 = 'uno'
>
> y el siguiente código:
>
> x = Prueba()
> print x.dato1    # muestra 1
> print x.dato2    # muestra 'uno', hasta acá todo OK
>
> x.dato3 = 4      # ?????
> print x.dato3    # muestra 4
>
> La pregunta es: ¿por qué en Python no existe un mecanismo para evitar
> este tipo de código? ¿Por qué es posible asignar un valor y crear una
> variable dentro de una clase, si ésta no lo define en su misma
> especificación?

Porque en python la definicion de una variable (mejor dicho, del
``nombre'' de un objeto) se hace en el momento de la primer
asignación (binding).  Se usa el mismo mecanismo tanto para
atributos de instancias como para simples variables locales.

Pero si aun insistes, es posible hacerlo.  Usa el nuevo tipo de
clases, aquellas que derivan de object:

  >>> class Prueba(object):
  ...     __slots__ = ('dato1', 'dato2')
  ...
  >>> x = Prueba()
  >>> x.dato1 = 1
  >>> x.dato2 = 'hola'
  >>> x.dato3 = 3.5
  Traceback (most recent call last):
    File "<stdin>", line 1, in ?
  AttributeError: 'Prueba' object has no attribute 'dato3'
  >>>

Saludos,
-H.

PD: ¡vaya hora para programar en python! ;-)




Más información sobre la lista de distribución Python-es