Python instantáneo - Objetos y cosas
Tutorial creado por Magnus Lie Hetland. Extraido de: http://www.mononeurona.org/index.php?idp=204
08 de Noviembre de 2005
Programación estructurada
3 - Objetos y cosas
Supongo que sabes cómo funciona la programación orientada a objetos (de otro modo, esta sección podría resultar un poco confusa, pero no importa, empieza a jugar con los objetos :)). En Python se definen las clases con la palabra clave (¡sorpresa!) class, de este modo:
class Cesta:
# Recuerde siempre el argumento self
def init(self,contenido=None):
self.contenido = contenido or []
def añadir(self,elemento):
self.contenido.append(elemento)
def muestra_me(self):
resultado = for elemento in self.contenido: resultado = resultado + " " + `elemento` print "Contiene:"+resultado Cosas nuevas: ~1) Todos los métodos (funciones de un objeto) reciben un argumento adicional al principio de la lista de argumentos, que contiene el propio objeto. Este argumento, por convención, se suele llamar ##self## (que significa 'uno mismo'), como en el ejemplo. ~1) A los métodos se los llama de este modo: ##objeto.método(arg1,arg2)##. ~1) Alguno nombres de método, como ##__init__## están predefinidos, y significan cosas especiales. ##__init__## es el nombre del //constructor// de la clase, es decir, es la función a la que se llama cuando creas una instancia. ~1) Algunos argumentos son //opcionales// y reciben un valor dado (según lo mencionado antes, en la sección de funciones). Esto se realiza escribiendo la definición así: def magro(edad=32): ... Aquí, se puede llamar a ##magro## con uno o cero parámetros. Si no se pone ninguno, el parámetro ##edad## tendrá el valor 32. ~1) "Lógica de cortocircuito." Esto es un punto... Ver más tarde. ~1) Las comillas invertidas convierten un objeto en su representación como cadena (así que si ##elemento## contiene el número 1, ##`elemento`## es lo mismo que ##"1"## mientras que ##'elemento'## es una cadena literal). ~1) El signo más ##+## se utiliza también para concatenar listas. Las cadenas son sólo listas de caracteres (lo que significa que se puede utilizar indexado, corte y la función ##len## en ellas; chulo, ¿eh?). Ningún método o variable miembro es protegido (ni privado, ni nada de eso) en Python. La encapsulación es, en su mayoría, cuestión de estilo al programar. Retomando el tema de la lógica de cortocircuito... Todos los valores de Python se pueden utilizar como valores lógicos. Algunos, los más "vacíos", como ##[]##, ####, ## y None representan el valor lógico "falso", mientras el resto (como [0], 1 or "Hola, mundo") representan el valor lógico "verdadero".
Las expresiones lógicas como a and b se evalúan de este modo: Primero, se comprueba si a es verdadero. Si no, simplemente se devuelve su valor. Si sí, simplemente se devuelve b (que representa el valor lógico de la expresión). La lógica correspondiente a a or b es: Si a es verdadero, devolver su valor. Si no, devolver b.
Este mecanismo hace que and y or se comporten como los operadores lógicos que supuestamente implementan, pero también permite escribir expresiones condicionales muy curiosas. Por ejemplo, el código
if a:
print a
else:
print b
Se puede sustituir por:
print a or b
De hecho, esto es casi un 'deje' en Python, así que mejor irse acostumbrando. Esto es lo que hacemos en el método Cesta.init . El argumento contenido tiene el valor por defecto None (que es, entre otras cosas, falso). Por lo tanto, para comprobar si tenía valor, podríamos escribir:
if contenido:
self.contenido = contenido
else:
self.contenido = []
Por supuesto, ahora conocemos un método mejor, Y, ¿por qué no le damos el valor por omisión [] para empezar? Por el modo en que funciona Python, esto daría a todas las Cestas la misma lista vacía como contenido por omisión. Tan pronto como se empezara a llenar una de ellas, todas tendrían los mismos elementos y el valor por omisión dejaría de ser vacío... Para informarse sobre el tema, lee la documentación y busca la diferencia entre identidad e igualdad.
Otro modo de hacer lo anterior es:
def init(self, contenido=[]):
self.contenido = contenido[:]
¿Adivinas cómo funciona esto? En lugar de utilizar la misma lista vacía siempre, utilizamos la expresión contenido[:] para hacer una copia (hacemos un corte que contiene toda la lista).
Así que, para hacer realmente una Cesta y utilizarla (es decir, llamar a alguno de sus métodos) haríamos algo así:
b = Cesta(['manzana','naranja'])
b.añadir("limón")
b.muestra_me()
Hay más métodos mágicos además de init. Uno de ellos es str, que define el aspecto que quiere tener el objeto si se le trata como una cadena. Lo utilizaríamos en nuestra cesta en lugar de presenta_me :
def str(self):
resultado = ""
for elemento in self.contenido:
resultado = resultado + " " + `elemento`
return "Contiene:"+resultado
Y, si quisiéramos mostrar la cesta b, simplemente diríamos:
print b
chulo, ¿eh?
La herencia se realiza de este modo:
class CestaMagro(Cesta):
# ...
Python permite la herencia múltiple, así que puede indicar varias super-clases entre los paréntesis, separadas por comas. Las clases se instancian así: x = Cesta(). Los constructores se definen, como dije, implementando la función miembro especial init. Pongamos que CestaMagro tuviera un constructor init(self,tipo). Podría realizar una cesta de magro así: y = CestaMagro("manzanas") .
Si necesitase llamar al constructor de una super-clase desde el constructor H de CestaMagro, lo haría así: Cesta.init(self) . Observe que, además de proporcionar los parámetros normales, debe proporcionar explícitamente self, ya que init de la super-clase no sabe con qué instancia está tratando.
Para obtener más información sobre las maravillas de la programación orientada a objetos en Python, mire la sección 9∞ de la tutoría.
class Cesta:
# Recuerde siempre el argumento self
def init(self,contenido=None):
self.contenido = contenido or []
def añadir(self,elemento):
self.contenido.append(elemento)
def muestra_me(self):
resultado = for elemento in self.contenido: resultado = resultado + " " + `elemento` print "Contiene:"+resultado Cosas nuevas: ~1) Todos los métodos (funciones de un objeto) reciben un argumento adicional al principio de la lista de argumentos, que contiene el propio objeto. Este argumento, por convención, se suele llamar ##self## (que significa 'uno mismo'), como en el ejemplo. ~1) A los métodos se los llama de este modo: ##objeto.método(arg1,arg2)##. ~1) Alguno nombres de método, como ##__init__## están predefinidos, y significan cosas especiales. ##__init__## es el nombre del //constructor// de la clase, es decir, es la función a la que se llama cuando creas una instancia. ~1) Algunos argumentos son //opcionales// y reciben un valor dado (según lo mencionado antes, en la sección de funciones). Esto se realiza escribiendo la definición así: def magro(edad=32): ... Aquí, se puede llamar a ##magro## con uno o cero parámetros. Si no se pone ninguno, el parámetro ##edad## tendrá el valor 32. ~1) "Lógica de cortocircuito." Esto es un punto... Ver más tarde. ~1) Las comillas invertidas convierten un objeto en su representación como cadena (así que si ##elemento## contiene el número 1, ##`elemento`## es lo mismo que ##"1"## mientras que ##'elemento'## es una cadena literal). ~1) El signo más ##+## se utiliza también para concatenar listas. Las cadenas son sólo listas de caracteres (lo que significa que se puede utilizar indexado, corte y la función ##len## en ellas; chulo, ¿eh?). Ningún método o variable miembro es protegido (ni privado, ni nada de eso) en Python. La encapsulación es, en su mayoría, cuestión de estilo al programar. Retomando el tema de la lógica de cortocircuito... Todos los valores de Python se pueden utilizar como valores lógicos. Algunos, los más "vacíos", como ##[]##, ####, ## y None representan el valor lógico "falso", mientras el resto (como [0], 1 or "Hola, mundo") representan el valor lógico "verdadero".
Las expresiones lógicas como a and b se evalúan de este modo: Primero, se comprueba si a es verdadero. Si no, simplemente se devuelve su valor. Si sí, simplemente se devuelve b (que representa el valor lógico de la expresión). La lógica correspondiente a a or b es: Si a es verdadero, devolver su valor. Si no, devolver b.
Este mecanismo hace que and y or se comporten como los operadores lógicos que supuestamente implementan, pero también permite escribir expresiones condicionales muy curiosas. Por ejemplo, el código
if a:
print a
else:
print b
Se puede sustituir por:
print a or b
De hecho, esto es casi un 'deje' en Python, así que mejor irse acostumbrando. Esto es lo que hacemos en el método Cesta.init . El argumento contenido tiene el valor por defecto None (que es, entre otras cosas, falso). Por lo tanto, para comprobar si tenía valor, podríamos escribir:
if contenido:
self.contenido = contenido
else:
self.contenido = []
Por supuesto, ahora conocemos un método mejor, Y, ¿por qué no le damos el valor por omisión [] para empezar? Por el modo en que funciona Python, esto daría a todas las Cestas la misma lista vacía como contenido por omisión. Tan pronto como se empezara a llenar una de ellas, todas tendrían los mismos elementos y el valor por omisión dejaría de ser vacío... Para informarse sobre el tema, lee la documentación y busca la diferencia entre identidad e igualdad.
Otro modo de hacer lo anterior es:
def init(self, contenido=[]):
self.contenido = contenido[:]
¿Adivinas cómo funciona esto? En lugar de utilizar la misma lista vacía siempre, utilizamos la expresión contenido[:] para hacer una copia (hacemos un corte que contiene toda la lista).
Así que, para hacer realmente una Cesta y utilizarla (es decir, llamar a alguno de sus métodos) haríamos algo así:
b = Cesta(['manzana','naranja'])
b.añadir("limón")
b.muestra_me()
Hay más métodos mágicos además de init. Uno de ellos es str, que define el aspecto que quiere tener el objeto si se le trata como una cadena. Lo utilizaríamos en nuestra cesta en lugar de presenta_me :
def str(self):
resultado = ""
for elemento in self.contenido:
resultado = resultado + " " + `elemento`
return "Contiene:"+resultado
Y, si quisiéramos mostrar la cesta b, simplemente diríamos:
print b
chulo, ¿eh?
La herencia se realiza de este modo:
class CestaMagro(Cesta):
# ...
Python permite la herencia múltiple, así que puede indicar varias super-clases entre los paréntesis, separadas por comas. Las clases se instancian así: x = Cesta(). Los constructores se definen, como dije, implementando la función miembro especial init. Pongamos que CestaMagro tuviera un constructor init(self,tipo). Podría realizar una cesta de magro así: y = CestaMagro("manzanas") .
Si necesitase llamar al constructor de una super-clase desde el constructor H de CestaMagro, lo haría así: Cesta.init(self) . Observe que, además de proporcionar los parámetros normales, debe proporcionar explícitamente self, ya que init de la super-clase no sabe con qué instancia está tratando.
Para obtener más información sobre las maravillas de la programación orientada a objetos en Python, mire la sección 9∞ de la tutoría.
Valora este capítulo:
Autor y licencia de 'Python instantáneo - Objetos y cosas'
|
Opiniona sobre 'Python instantáneo - Objetos y cosas' (0)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Python instantáneo - Objetos y cosas'
Esto es un curso intensivo de introducción mínima al lenguaje de programación Python. Si te...
Más »
UML (Unified Modeling Language) es un lenguaje que permite modelar, construir y documentar los elementos...
Más »
Una de las características que diferencian al hombre como ser racional o como ''homo sapiens''...
Más »
El “hablante ingenuo”, es decir, aquel que no reflexiona expresamente acerca de su lengua, mantiene...
Más »


