Re: duda acerca de self como argumento de métodos

Chema Cortes pych3m4 en gmail.com
Mar Mayo 27 20:14:16 CEST 2008


El día 27 de mayo de 2008 15:21, Milton Galo Patricio Inostroza
Aguilera <minoztro en gmail.com> escribió:

>  Ayer durante una presentación en la Universidad me preguntaron por
> qué siempre tiene que ir como primer argumento de un método el
> argumento self, en realidad nunca me lo había cuestionado :-S....bueno
> en realidad es entendible que debe existir una referencia a la
> instancia pero por qué esto debe aparecer "explicitamente" en el
> código que el programador escribe y por qué no simplemente ocultarlo y
> usar un atributo especial como this?...Yo a priori pienso que es por
> facilidad de usabilidad y siempre es mejor "visible" que "oculto y
> mistico".

En python tenemos el lema Zen de "mejor explícito que implícito".

Aunque en este caso también habría que hablar de otro de los lemas
Zen, el de la "simplicidad". El uso explícito del argumento self
permite que no existan diferencias entre el bytecode de una función o
el de un método, algo que simplifica bastante la máquina virtual al no
tener que tratar "modos" diferentes de interpretación según el
contexto.

def f(self):
  print self.x

class C(object):
  m=f

c=C()
c.x="Hola"
c.m()   --> print "Hola"
f(c)    --> print "Hola"


En este ejemplo, exactamente el mismo bytecode funciona como "función"
y como "método". El compilador no necesita crear código diferente
según se esté definiendo una función o un método.

Aún así, en python se complica la llamada al tener que enlazar la
instancia con el descriptor:

 c.m   <<<equivale a>>>    f.__get__(c,C)


Aunque está "implícito", al menos resulta bastante transparente para
el programador. En lua, por poner un contraejemplo, incluso las
invocaciones a los métodos son explícitas. Este método se llamaría
así:

 c.m(c)

Para evitar tanta redundancia, lua tiene una facilidad sintáctica que
mejora la legibilidad:

c:m()   <<<equivale a>>>  c.m(c)


En fin, todo son gustos.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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