Preguntas sencillas

Chema Cortes chemacortes en wanadoo.es
Lun Mar 3 06:37:01 CET 2003


En respuesta a Gonzalez Suarez, Daniel
<dgonzalez en sevillana.grupoendesa.com>:

> Sigo con las preguntas sencillas. A raíz de la respuesta de José L. se me
> plantea una nueva pregunta sencillita, ¿qué hay que hacer para añadir un
> método a una clase en tiempo de ejecución?

Pues tan simple como añadirlo:

class C(object):
pass

def pepe(self,n):
self.a=n

C.__init__=pepe

c=C(10)
print c.a

> Debo decir que tanta flexibilidad de Python no me gusta un pelo. Prefiero
> que en tiempo de compilación se detecten errores del tipo "Método o
atributo
> no existe".

A partir del python 2.2 es posible (aunque sólo para atributos). Mírate el
atributo "__slots__":

class C(object):
__slots__=('a','b')

c=C()
c.a=10
c.b=20
c.c=30 # Da error


> Otra cosa que no ha me gustado es el mecanismo cutre para definir
atributos
> y métodos privados (anteponiéndole __ al nombre del atributo/método). Y
> mucho menos el truco para poder acceder a atributos/métodos privados
> (_nombreClase__nombreAtributo).

Es un convenio de nombres como consecuencia de que todo atributo ó método es
virtual. Con este convenio te aseguras de que no macharás un método privado
por otro método en tiempo de ejecución (con algo similar a lo que ponía al
principio del mensaje).

En cuanto al "mangling" del nombre es habitual en muchos otros lenguajes.
Los debuggers suelen ocultarlo al desarrollador, pero si te miras un código
compilado en C++ ó Java con un editor hexadecimal verás como se está
empleando. En python es más "explícito" por la facilidad de introspección
que tiene el entorno; pero no lo consideraría como "truco". El nombre
"manglered" es tan rebuscado con el único fin de que no sea utilizado bajo
ninguna circunstancia.


--
"Haz software libre, no la guerra"




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