Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003
1. Programación Orientada a Objetos
mayo, 2003
El lenguaje de programación Python
Manuel Casado Martín
Santiago Guadalajara Pérez
Departamento de Informática y Automática
Universidad de Salamanca
3. Resumen
Este documento pretende ser una introducción a las características generales del lenguaje, como
la sintaxis o el modelo objetos.
Aunque este documento no sea un tutorial, proporciona la suficiente información para
ayudar a auto-orientarse a los posibles futuros programadores de Python.
PYTHON i
4. Abstract
This document intends to be an introduction to the general features of the language, like syntax
or the object model.
Although this document is not a tutorial, it provides enough information to help prospective
Python programmers orient themselves.
ii ¡Error! No se encuentra el origen de la referencia.
5. Tabla de Contenidos
1. Una visión general ______1
1.1. Un poco de historia _______ 1
1.2. ¿Qué es Python? 1
2. El lenguaje de programación Python 2
2.1. Sintaxis 2
2.2. Funciones 4
2.3. Tipos de datos 5
2.4. Módulos 7
2.5. Errores y excepciones 8
3. Python como lenguaje orientado a objetos ______10
3.1. Clases 10
3.2. Herencia 14
4. Usando Python 15
4.1. Python como lenguaje de scripts 16
5. Conclusiones 19
6. Referencias 19
Índice de Figuras
1. Ejemplo de herencia____________________________________________________15
PYTHON iii
6.
7. 1. Una visión general de Python
1.1 Un poco de historia
El lenguaje de programación Python fue creado a principios de 1990 por Guido van
Rossum en Holanda como sucesor de un lenguaje anterior llamado ABC. En 1995 Guido
continuó trabajando en Python en el CNRI (Corporación internacional para la búsqueda de
iniciativas) en Reston, Virginia. Durante esta época lanzó varias versiones del lenguaje.
A finales del año 2000 el equipo de Python se trasladó a Zope Corporation y un año
después se formó PSF (Python Software Fundation), siendo Zope Corporation su principal
patrocinador.
Todas las versiones de Python son Open Source. Además, la mayoría de las versiones de
Python que han sido liberadas desde su creación también han tenido licencia GPL (las únicas sin
licencia GPL son la 1.6, 2.0, 1.6.1 y 2.1).
La última versión del lenguaje es la 2.2.1 y está en continuo desarrollo (aproximadamente
cada seis meses se publica una nueva versión).
1.2 ¿Qué es Python?
Python es un lenguaje de programación interpretado orientado a objetos de muy alto nivel.
Sus estructuras de datos de alto nivel, combinadas con tipado dinámico y ligadura dinámica lo
hacen especialmente atractivo para el desarrollo de aplicaciones rápidas, así como lenguaje de
scripts o medio de conexión de otros componentes ya existentes.
Además, la claridad y sencillez de su sintaxis mejora notablemente la legibilidad de los
programas escritos en Python y por lo tanto reduce el coste de mantenimiento del software.
Python soporta además módulos y paquetes, lo que incrementa la modularidad y la
reutilización de código. Permite incorporar rutinas compiladas en C para realizar funciones
críticas a alta velocidad. También implementa estructuras de datos muy avanzadas (lista, tuplas,
diccionarios) que pueden ser combinadas para crear otras estructuras más complejas.
Su intérprete y la librería de Python están disponibles para las principales plataformas
(Linux, Windows, UNIX...) en código fuente o binario y pueden ser distribuidas libremente.
Asimismo, Python se caracteriza por disponer de una excelente documentación y una de las
mejores guías de aprendizaje.
Python está escrito en C. Existe una implementación del lenguaje Python implementada
únicamente en Java: Jython. La mayoría de las librerías del Python estándar han sido ya
portadas a Jython, sin embargo el desarrollo de Python es tan rápido que los desarrolladores de
Jython tienen problemas para portar todas las innovaciones.
1.2.1 Python es un lenguaje interpretado
Se entiende por “lenguaje interpretado” aquel lenguaje cuyas instrucciones se ejecutan
directamente a partir del código fuente.
Para ejecutar el código de este lenguaje es necesario un intérprete, que va recibiendo líneas
de código y las traducirá a lenguaje máquina para que se ejecuten. A diferencia de los lenguajes
compilados no se produce código ejecutable, de modo que para ejecutar el código en diferentes
plataformas solo hay que cambiar el intérprete, no el código.
-1-
8. El lenguaje de programación Python
El hecho de ser un lenguaje interpretado hace que Python sea, a priori, más lento que los
lenguajes compilados. Sin embargo, dado que Python se suele utilizar en programas cortos, las
diferencias al final no resultan muy significativas. Además, si necesitamos velocidad y
eficiencia en una determinada rutina podemos implementarla en C e importarla a nuestro
código.
2. El lenguaje de programación Python
Las posibilidades que ofrece este lenguaje como lenguaje de programación son muy
amplias y completas. Esta es una pequeña introducción a las características más destacables.
2.1. Sintaxis
Uno de los rasgos más importantes de Python es la claridad de su sintaxis. Se debe tener en
cuenta que Python es un lenguaje de programación muy cercano al pseudo-código. De hecho
llega a ser considerado como pseudo-código ejecutable.
La sintaxis de Python es realmente sencilla. No hay palabras reservadas para iniciar o
finalizar bloques ni programas, no es necesario declarar variables...
Ejemplo código en Python:
# Ejemplo
opcion = “salir”
if opcion == “salir”:
print “Ha decidido salir”
valor = 1
print “saliendo...”
Para definir bloques de código se usa solamente la tabulación, sin llaves ni begin/end. En el
ejemplo, el código
print “Ha decidido salir”
valor = 1
constituiría un bloque, que se ejecutará en caso de que la variable opcion contenga la
cadena salir.
El hecho de usar la tabulación para marcar el inicio y fin de un bloque hace que Python
presente siempre y obligatoriamente una estructura muy ordenada.
Las líneas que comiencen por # son comentarios y el intérprete hace caso omiso de ellas.
2.2 Estructuras de control
2.2.1. Sentencia while
El bucle while funciona de manera similar a otros lenguajes:
PYTHON 2
9. Casado y Guadalajara
while i<10:
print i
i = i+3
Podemos incluir una sentencia else en un bucle while, que se ejecutará cuando éste finalice,
a no se que hayamos salido de él con una sentencia break:
while i<10:
print i
i = i+3
else:
print “i ya no es menor que 10”
2.2.2. Sentencia if
El bucle if es también muy similar a otros lenguajes:
if nota >= 5:
print “Aprobado”
else:
print “Suspenso”
Tanto en Python como en C, 0 es falso y lo demás es cierto. Se usa como negación la
palabra not.
if not(x%2):
return 1
2.2.3. Sentencia for
El bucle for es ligeramente diferente a como lo conocemos en otros lenguajes. En Python
la sentencia for debe ir seguida por una lista o tupla.
Se dispone de la instrucción range para generar un conjunto de valores desde 0 hasta el
valor que fijemos o entre dos valores que queramos.
for x in range(3):
print x
La salida sería:
0
1
2
3 PYTHON
10. El lenguaje de programación Python
En este otro ejemplo:
numero = 10
secuencia = [1,2,’Salamanca’,’Avila’,numero]
for x in secuencia:
print x
Obtendríamos la salida
1
2
Salamanca
Avila
10
2.3 Funciones
Las funciones se definen con la palabra reservada def seguida del identificador de la
función y entre paréntesis los parámetros sin especificar el tipo. Ejemplo:
def mi_funcion(x):
print “Digo”,x
mi_funcion(‘Hola’)
La salida sería:
Digo Hola
En Python todos los parámetros se pasan por referencia. Tiene la posibilidad de pasar
argumentos con nombre, argumentos por omisión o manejar un número de argumentos variable
para una función.
Otra cosa que lo hace peculiar es el hecho de poder tratar las funciones como valores. Así
se pueden hacer cosas como:
def mi_funcion(x):
print "Digo",x
decir = mi_funcion
decir("Que tal")
PYTHON 4
11. Casado y Guadalajara
decir(10)
Cuya salida es:
Digo Que tal
Digo 10
Al igual que en C, en Python no se distingue entre funciones y procedimientos. Las
funciones devuelven por defecto el valor None. Para devolver un valor determinado se emplea
la sentencia return.
def mi_funcion(x):
argumento = x
return 0
valor = mi_funcion(10)
print "La funcion 'mi_funcion' devuelve el valor:",valor
Cuya salida sería
La funcion 'mi_funcion' devuelve el valor: 0
Todo en Python son objetos, incluso las funciones. Un atributo especialmente interesante es
__doc__. En este atributo se almacenan las llamadas “cadenas de documentación”, que son
cadenas de texto que se colocan en la línea siguiente a la definición de la función. Sirven para
aclarar que hace la función y son muy útiles cuando trabajamos sobre código que ha escrito otro
programador. Un ejemplo muy simple:
def cuad(x):
“Devuelve el cuadrado del valor pasado como argumento”
return x*x
print cuad.__doc__
Cuya salida es
Devuelve el cuadrado del valor pasado como argumento
2.4 Tipos de datos
Merecen especialmente atención tres tipos de datos complejos que Python implementa
directamente. Estos son las listas, tuplas y diccionarios
5 PYTHON
12. El lenguaje de programación Python
2.4.1 Listas
El tipo de datos más versátil e interesante en Python son las listas. Las listas en Python se
escriben como un conjunto de valores entre corchetes separados por comas. Estos valores no
tienen por que ser del mimo tipo:
>>> a = ['hola', 'adios', 100, 1234]
>>> a
['hola', 'adios', 100, 1234]
Existen numerosas funciones implementadas que permiten fácilmente insertar un elemento
en la lista, extraerlo, concatenar listas, etc. Gracias a estos métodos es muy sencillo utilizar una
lista como pila...:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
o como cola:
>>> queue = ["Luis", "Daniel", "Lucia"]
>>> queue.append("Miguel")
>>> queue.append("Elena")
>>> queue.pop(0)
'Luis'
>>> queue.pop(0)
PYTHON 6
13. Casado y Guadalajara
'Daniel'
>>> queue
['Lucia', 'Miguel', 'Elena']
En este caso, para extraer un elemento del principio de la cola será necesario llamar a la
función pop() con el argumento 0
2.4.2 Tuplas
Las tuplas son similares a las listas, salvo que en este caso no son mutables, no se pueden
modificar sus elementos:
>>> tupla = (1,4324,233.45,'hola')
>>> tupla[1] = 'noooo'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
2.4.3 Diccionarios
Los diccionarios o memorias asociativas son pares clave-valor donde clave puede ser cualquier
objeto no mutable. Las claves han de ser únicas dentro de un diccionario. Ejemplo:
>>> telefono = {'maria':3331234,'luis':5551235}
>>> telefono
{'luis': 5551235, 'maria': 3331234}
>>> telefono['maria']
3331234
>>> telefono.keys()
['luis', 'maria']
>>> telefono.has_key('maria')
1
>>> telefono.has_key('alberto')
0
2.5 Módulos
Un módulo en Python es un fichero con extensión .py que contiene definiciones e
implementaciones de funciones.
Existe en Python un gran conjunto de módulos, cada uno de ellos especializado en un
campo de aplicación determinado. Precisamente, una de las razones por las que Python es un
lenguaje potente y extremadamente útil es por la gran colección de módulos con que se
distribuye. Cualquier programador de Python puede crear sus propios módulos añadiendo así
funciones que simplifican la programación en un ámbito cualquiera y poniéndolas a disposición
de otros programadores.
7 PYTHON
14. El lenguaje de programación Python
Estos módulos pueden ser importados dentro de otros módulos o dentro del módulo
principal. Las sentencias import ... from permiten a un módulo hacer referencia a objetos del
espacio de nombres de otro módulo, con la diferencia de que
from Matematicas import integral
añade integral al espacio de nombres del módulo actual como una referencia al objeto
externo en cuestión mientras que
import Matematicas
importa el módulo Matemáticas permitiendo hacer referencia a cualquier objeto del
espacio de nombres de Matemáticas, como por ejemplo Matemáticas.integral
2.6 Errores y excepciones
Se pueden distinguir en Python dos tipos de errores: errores de sintaxis y excepciones.
2.6.1 Errores de sintaxis
Se producen al escribir algo erróneo en el intérprete, este señala lo sucedido marcando el
error, el nombre del fichero y el número de línea del que procede el error (los dos últimos, si la
entrada viene de un fichero).
while 1 print ’Hola mundo’
^
SyntaxError: invalid syntax
2.6.2 Excepciones
Aunque una expresión sea sintácticamente correcta, puede originar un error al intentar
ejecutarla, a este tipo de error que se produce durante la ejecución se le llama excepción, que no
implican la destrucción de la aplicación y se pueden gestionar en Python. Una excepción es de
la forma:
>>> 10 * (1/0)
Traceback (innermost last):
File "<stdin>", line 1
ZeroDivisionError: integer division or modulo
Las excepciones pueden ser de diversos tipos. En la biblioteca de referencia que incorpora
la distribución del lenguaje se enumeran las excepciones internas y sus respectivos significados.
PYTHON 8
15. Casado y Guadalajara
Las excepciones se pueden gestionar dentro de un programa, como muestra el ejemplo:
>>> while 1:
... try:
... x = int(raw_input("Introduzca un numero: "))
... break
... except ValueError:
... print "El valor introducido no es un numero valido"
...
Primero se ejecuta la cláusula try. Si no se produce ningún error la cláusula except es
saltada. Si se produce un error que corresponde con el tipo de error que indica alguna sentencia
except, se ejecuta su código (en este caso, si el tipo de error fuese ValueError, se
imprimiría “EL valor introducido no es un numero valido”).
Se puede usar la cláusula except omitiendo el nombre de la excepción para hacerla de
propósito general:
import string, sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(string.strip(s))
except IOError, (errno, strerror):
print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
En el ejemplo, si no se produce un error de entrada/salida ni un error de valor, se mostraría
el mensaje "Unexpected error:".
Existe también la posibilidad de forzar excepciones o de crear excepciones definidas por el
usuario.
3. Python como lenguaje orientado a objetos
9 PYTHON
16. El lenguaje de programación Python
3.1 Clases
Las clases en Python no ponen una barrera absoluta entre la definición y el usuario, sino que
más bien se fían de la buena educación del programador para no invadir la definición. El
mecanismo de herencia soporta la herencia múltiple, los métodos pueden ser redefinidos en las
clases derivadas y un método puede llamar a otro del mismo nombre de una clase base. Los
objetos pueden contener una cantidad arbitraria de atributos. Como se diría en C++ todos los
miembros de una clase son públicos y todas las funciones método son virtuales. No hay
constructores ni destructores. En Python todo son objetos, lo que implica que una clase (como
un tipo de datos) es en si misma un objeto. Esto proporciona la semántica de importar y
renombrar. Es posible redefinir los operadores internos con sintaxis especial.
Normalmente se define objeto como una instancia de una clase, pero en Python esta
definición no es correcta, ya que en hay tipos de datos que no son clases (enteros, listas,
ficheros...), sin embargo, todos los tipos de Python comparten algo de semántica común,
descrita adecuadamente mediante la palabra “objeto”.
Los objetos tienen individualidad y en Python se pueden asignar varios nombres a un
mismo objeto (“generación de alias”, que en algunos aspectos se parecen a los punteros), que
cuando el objeto es inmutable no es importante, pero cuando el objeto es mutable y se
cambia su estado, se acceda con el nombre que se acceda el objeto esta actualizado (de esta
forma también se elimina el tener que traspasar parámetros mediante dos mecanismos).
3.1.1 Ámbitos y espacios nominales:
Un espacio nominal es una correspondencia entre nombres y objetos. Ejemplos de espacios
nominales:
- Conjunto de nombres internos (funciones y excepciones internas).
- Los nombres globales de un módulo.
- Los nombres locales dentro de una llamada a función.
En cierto sentido, los atributos de un objeto también forman un espacio nominal. No hay
ninguna relación entre los nombres de dos espacios nominales distintos.
Los espacios nominales se crean en diferentes momentos y tienen tiempos de vida
diferentes. El espacio nominal que contiene los nombres internos se crea al arrancar el intérprete
de Python y no se borra nunca. El espacio nominal de un módulo se crea al leer la definición del
módulo y normalmente duran hasta que se sale del intérprete. El espacio nominal local de una
función se crea al llamar a la función, y se borra cuando se sale de la misma, mediante una
sentencia return, o bien mediante alguna excepción que la función no captura.
Un ámbito es una región textual de un programa Python donde el espacio nominal es
directamente accesible, es decir, los nombres que encuentra una referencia sin calificar (sin
puntos). Aunque los ámbitos se determinan estáticamente, se usan dinámicamente. En cualquier
punto de la ejecución existen tres ámbitos anidados (accesibles directamente): el interior
(nombres locales), el medio (nombres globales del módulo) y el externo (nombres internos).
Un asunto especial de Python es que las asignaciones siempre van en el ámbito más
interno, no copian datos, simplemente asignan nombres a objetos. Lo mismo es válido para los
borrados.
Las operaciones que introducen nombres nuevos utilizan el ámbito local, y se puede utilizar
la sentencia global para indicar que la variable reside en el ámbito global.
PYTHON 10
17. Casado y Guadalajara
3.1.2 Sintaxis:
La forma más fácil de definir una clase es de la forma:
class nombreClase:
<sentencia-1>
.
.
.
<sentencia-N>
Cuando se crea una clase nueva, se genera un nuevo “espacio nominal” (correspondencia
entre nombres y objetos) que se utiliza como ámbito local.
Para que la definición de una clase tenga efecto tiene que ejecutarse, esto implica que sea
válido introducir una definición de una clase dentro de una sentencia “if” o similar.
En un primer momento las sentencias dentro de una clase deberían ser funciones, aunque es
posible poner cualquier otro tipo de sentencia, lo que puede resultar en algunos casos muy útil.
Cuando se abandona una definición de clase de manera normal (se ejecuta la última línea
de su código), se crea un objeto de clase. Es, sencillamente, un envoltorio del contenido del
espacio nominal creado por la definición de la clase. El ámbito local original (el que estaba
activo cuando se entró en la definición de clase) se reinstancia y el objeto clase se enlaza con el
nombre de clase dado en la cabecera de la función (en el ejemplo nombreClase).
3.1.3 Objetos clase:
Los objetos en Python soportan dos tipos de operaciones:
1.- Referencias a atributos: para acceder a un atributo de un objeto se sigue la sintaxis
estándar de Python (obj.nombre). Los nombres de atributos válidos son todos los nombres
que estaban en el espacio nominal de la clase cuando fue creada la clase.
2.- Instanciación de una clase: para instanciar una clase se sigue la notación de funciones,
es decir, es suficiente con imaginar que la es una llamada a una función que no tiene parámetros
y que devuelve una instancia nueva de la clase.
Así, para la definición de la clase:
class MiClase:
i = 12345
def f(x):
return 'hola, mundo'
MiClase.i y MiClase.f serían referencias a atributos válidas, que devuelven un
entero y un objeto método, respectivamente.
Con la sentencia x = MiClase () se crea una nueva instancia de la clase y se la asigna
a la variable local “x”. Esta operación genera un objeto vacío. Para asignarle un estado inicial
conocido se puede definir un método especial llamado __init__(). Cuando se crea una clase
que define un método __init__() al instanciar un objeto de la clase se llama
automáticamente al método __init__().
11 PYTHON
18. El lenguaje de programación Python
El método __init__() puede recibir parámetros, lo que añade una gran cantidad de
posibilidades. Estos parámetros los recibirá de los argumentos proporcionados al operador de
instanciación de la clase, por ejemplo:
class Complejo:
def __init__(self, parteReal, parteImaginaria):
self.r = parteReal
self.i = parteImaginaria
x = Complejo(3.0,-4.5)
3.1.4 Objetos instancia:
Los objetos instancias poseen:
1.- Atributos de datos: son aquellos que se denominan “miembros dato” en C++ y que en
Python no hace falta declarar, sino que aparecen cuando se les asigna por primera vez un valor.
Conviene recordar que estos atributos son siempre “públicos”, como se diría en C++ y que es
tarea del programador no romper y mantener el encapsulado.
2.- Métodos: un método es una función que “pertenece a” un objeto.
3.1.5 Objetos método:
Normalmente se llama a un método de forma inmediata (obj.método()) pero es posible no
hacerlo. obj.método es un objeto método y se puede almacenar para recuperar más tarde.
Lo que tienen de especial los métodos es que el objeto que los llama se pasa como primer
argumento de la función. En general, llamar a un método con una lista de argumentos es
equivalente a llamar a la función correspondiente con la lista de argumentos resultante de
insertar el objeto del método al principio de la lista de argumentos original.
Cuando se hace referencia a un atributo de una instancia que no es un atributo de datos, se
busca en su clase. Si el nombre denota un atributo de clase válido que resulta ser un objeto
función, se crea un objeto método empaquetando juntos (punteros hacia) el objeto instancia y el
objeto función recién encontrado en un objeto abstracto: el objeto método. Cuando se llama al
objeto método con una lista de argumentos, se desempaqueta de nuevo, se construye una nueva
lista de argumentos a partir del objeto instancia y la lista de argumentos original y se llama al
objeto función con la nueva lista de argumentos. Ejemplo:
xf = x.f
while 1:
print xf()
Los atributos de datos se tienen en cuenta en lugar de los atributos método con el mismo
nombre, para evitar estos conflictos nominales que son difíciles de detectar conviene usar un
patrón a la hora de escoger los nombres para los atributos y lo métodos. Por ejemplo empezar
los atributos con un guión bajo y los métodos con una letra mayúscula, o algo similar.
PYTHON 12
19. Casado y Guadalajara
Tanto los métodos como los usuarios de un objeto pueden acceder a los atributos del
objeto, puesto que todos los atributos y métodos son ‘públicos’, es decir, no se puede
implementar un tipo de datos abstracto puro. En Python no es posible “ocultar” los atributos,
todo se basa en convenciones y en la buena disciplina del programador.
Los clientes deben utilizar los atributos de datos con sumo cuidado, ya que pueden
introducir nuevos atributos de datos propios a una instancia de un objeto, y si no se elige un
nombre acertado o coherente puede haber conflictos nominales o incluso afectar al buen
funcionamiento de un método.
Por convención, el primer parámetro que recibe un método se suele denominar self, y
aunque no es obligatorio ayuda a que el código pueda ser más legible por otros programadores,
incluso no es extraño que pueda haber navegadores de clases que supongan que se sigue esta
notación.
Cualquier objeto función que es atributo de una clase define un método para las instancias
de esa clase, aunque no es necesario que la implementación de esa función este encerrada en la
definición de la clase, es decir, asignar un objeto función a una variable local de una clase es
válido, por ejemplo:
# Función definida fuera de la clase
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return ’hola, mundo’
h = g
Ahora f, g y h son atributos de la clase C, que hacen referencia a objetos función, por lo
que los tres son métodos de las instancias de la clase C.
Los métodos pueden llamar a otros métodos utilizando los atributos métodos del argumento
self. Por ejemplo:
class Bolsa:
def __init__(self):
self.datos = []
def agregar(self, x):
self.datos.append(x)
def agregarDosVeces(self, x):
self.add(x)
self.add(x)
Los métodos pueden hacer referencia a las variables globales del mismo modo que lo hacen
las funciones. Aunque es raro encontrar un buen motivo para que un método use una variable
13 PYTHON
20. El lenguaje de programación Python
global, hay casos en los que es legítimo el uso del ámbito global, es decir, los métodos pueden
utilizar las funciones y los módulos importados al ámbito global. Normalmente, la clase que
contiene al método esta definida en este ámbito global.
3.2 Herencia
Python a diferencia de otros lenguajes soporta los dos tipos de herencia, simple y múltiple:
Herencia simple: es el tipo de herencia en el cuál la clase derivada solo hereda las
características de una clase base. La sintaxis de definición de una clase derivada es de la forma:
class nombreClaseDerivada(nombreClaseBase):
<sentencia-1>
.
.
.
<sentencia-N>
El nombre nombreClaseBase debe estar definido en un ámbito que contenga la
definición de la clase derivada. En lugar de una clase base también se permite una expresión,
que suele resultar útil cuando la clase base está definida en otro módulo.
La ejecución de la definición de la ejecución de la clase derivada se lleva acabo del mismo
modo que en la clase base. Cuando se construye un objeto de la clase derivada se recuerda la
clase base. Esto se utiliza para resolver referencias a atributos: si no se encuentra el atributo
solicitado en la clase derivada se busca en la clase base, y así de forma recursiva.
Se puede instanciar una clase derivada de forma similar a una clase base:
nombreClaseDerivada(). Las referencias a métodos se resuelve buscando el atributo en
la clase correspondiente, descendiendo por la cadena de clases base (si es necesario).
Las clases derivadas pueden redefinir los métodos, si es necesario, de sus clases base (es
como si todas las funciones fueran virtuales en C++). También se permite que se amplíe un
método, sin remplazarlo por completo, de la siguiente forma:
nombreClaseBase.nombreMétodo(self, argumentos).
Herencia múltiple: La clase derivada recibe las características de más de una clase base. La
sintaxis de definición es de la siguiente forma:
PYTHON 14
21. Casado y Guadalajara
class nombreClaseDerivada(Base1, Base2, Base3):
<sentencia-1>
.
.
.
<sentencia-N>
La única regla necesaria para explicar la semántica es la regla de resolución utilizada para
las referencias a los atributos de la clase. Se busca primero en profundidad y luego de izquierda
a derecha. Así pues, primero se busca en la clase derivada, sino se encuentra en la clase Base1
y sus clases base, sino en la clase Base2 y sus clases base y así sucesivamente.
Parece más natural buscar primero en Base1 y luego en Base2 antes de entrar a examinar
las clases base de Base1, pero esta forma exigiría conocer si un atributo particular de Base1
esta realmente definido en Base1 o en sus clases base, pudiendo originar conflictos de nombres
con la Base2. Como Python no diferencia se recibe los atributos de una clase base de forma
directa o heredados, no se genera este problema. Un ejemplo es el de la figura:
A
B def f()
C D def f() (nueva definición)
E
Figura 1 – Ejemplo de herencia
E es clase derivada de las clases base C y D, por lo que en E esta definido el método f.
Si desde una instancia de E se ejecutará el método f, la implementación que realmente se
ejecutaría sería la de B, porque primero buscaría en C, que es derivada de B pero no tiene la
implementación de f, luego buscaría en B (y no en D), y como tiene la definición de f no
seguiría buscando. Si se quisiera usar el método de la clase D, habría que indicarlo de la manera
D.f()
De esto se puede deducir en una instancia de una clase derivada que hereda de dos clases
base que tienen una clase base común, solo tendrá una copia de los atributos y métodos de la
clase base común.
4. Usando Python
Cuando se desarrolla un script para la shell de un sistema operativo, se comprueba que
conforme aumenta la complejidad, aumenta enormemente el tamaño del mismo y se hace más
difícil de entender, más lento...
15 PYTHON
22. El lenguaje de programación Python
Otra situación que puede resultar familiar es el desarrollo de un programa que requiere el
uso de numerosas librerías y donde el común ciclo escritura/compilación/prueba/re-compilación
es demasiado lento y se necesita desarrollar software más rápidamente.
En ambos casos Python es el lenguaje ideal de programación. Permite desarrollar software
más rápidamente, más sencillo y de menor tamaño ya que:
- Los tipos de datos de alto nivel permiten expresar operaciones complejas en una sola
sentencia
- No se necesita la declaración de variables
- Los bloques de código se identifican por el tabulado
Se puede partir un programa en módulos que pueden emplearse en el desarrollo de otros
programas. Igualmente Python incorpora un conjunto de módulos básicos como de I/O,
llamadas al sistema, shockets, interfaz gráfica de usuario...
Además es extensible, de manera que es posible incorporar funciones o módulos de otros
lenguajes que puedan resultar más eficientes en una determinada situación.
Python puede ser usado como lenguaje de scripts, para la administración de sistemas, como
generador de código (especialmente en el ámbito de desarrollo web), para el desarrollo de
interfaces gráficas de usuario o cualquier otra tarea computacional.
4.1 Python como lenguaje de scripts
A menudo Python suele ser definido como “lenguaje de scripts”, lo cual es un error.
Python es un lenguaje de programación completo que soporta scripts, pero es mucho más que
eso. Aún así es en este campo donde mayor implantación tiene Python y probablemente donde
mayor eficacia presta.
Pero ¿qué es un script? Un script es un conjunto de instrucciones que se ejecutan paso a
paso, instrucción a instrucción.
Están especialmente indicados para pequeños programas que necesiten interactuar de
manera más o menos fluida con el Sistema Operativo.
Los lenguajes de scripts se conocen con el nombre de middleware ya que son capaces de
gestionar transferencias de datos entre aplicaciones o entre aplicaciones y el SO. Habitualmente
se pueden ampliar mediante plugins o módulos (en el caso de Python) e incluso pueden ser
empotrados en otras aplicaciones.
Ejemplo: script que realiza la búsqueda en Google y devuelve los resultados:
import httplib
URL = 'www.google.com'
COD_BUSQUEDA = '/search?num=100&q='
CABECERA = '<b>...</b> n<br><font color=#008000>'
PYTHON 16
23. Casado y Guadalajara
FIN = ' '
NUM_RESULTADOS = 10
MAX_RESULTADOS = 50
def formateaQuery(query):
from string import join
a = query.split()
return join(a,'+')
def google(query=None,n=None):
if n is None:
n = NUM_RESULTADOS
if query is None:
print "No se ha efectuado la busqueda"
return -1
busqueda = run(query,n)
if busqueda == -2:
print 'La busqueda para %s no ha arrojado
resultados.'%(query.replace('+',' '))
return
if busqueda == -1:
print 'No se ha podido efectuar la conexion'
return
for x in busqueda:
print x
def run(query,n):
try:
conn = httplib.HTTPConnection(URL)
conn.request("GET",COD_BUSQUEDA+formateaQuery(query))
r = conn.getresponse()
except:
print 'No se ha podido efectuar la conexion'
return -1
if r.reason == 'OK':
data = r.read()
else:
17 PYTHON
24. El lenguaje de programación Python
return -1
conn.close
aux = data.split(CABECERA)
#Hay que desechar el primer elemento
aux.pop(0)
if len(aux)==0:
return -2
busqueda = []
i=0
while n!=0 and i<MAX_RESULTADOS:
try:
a = aux[i].split(FIN,2)[0]
if a!=' ':
busqueda.append('http://'+a)
n-=1
except:
pass
i+=1
return busqueda
Ahora lo ejecutamos:
>>> google("salamanca",10)
http://www.readysoft.es/home/cisalamanca/salamanca/
http://www.cyberspain.com/ciudades-patrimonio/isalaman.htm
http://www.cyberspain.com/ciudades-patrimonio/esalaman.htm
http://www.salamancaciudad.com/
http://www3.usal.es/~sabus/bibliotecas/pagprincipalbib.htm
http://www3.usal.es/~farmacia/
http://www.elperiodico.es/salamanca/
http://www.salamancawireless.net/
http://www.arteguias.com/mudejar_salamanca.htm
http://www.guiasalamanca.com/
PYTHON 18
25. Casado y Guadalajara
5. Conclusiones
El tipado dinámico, la ligadura tardía, la gran cantidad de módulos de Python y la
simplicidad de su sintaxis hacen que los programas escritos con este lenguaje sean realmente
cortos y rápidos de desarrollar, aunque el rendimiento baja bastante cuando el programa es un
poco extenso.
La gran cantidad de módulos y librerías de las que dispone hacen que el ámbito de
utilización de Python sea muy extenso, abarcando desde gestión de sistemas y proyectos web
hasta interfaces gráficas de usuario, sin olvidarse de los scripts.
Python es usado por grandes compañías como: Google, HP, IBM y Red Hat. Ejemplo de
utilización Python: un trabajo con muchos módulos o ficheros distintos, y al final de cada día se
quiere hacer una copia de seguridad en un disquete de todos ellos, en vez de estar copiándolos a
mano, o hacer un programa en C, o C++ (que puede ser un trabajo tedioso), lo mejor es hacer un
pequeño programa escrito en Python.
6. Referencias
[1] La pagina oficial de Python: http://www.python.org
[2] Noticias sobre Python: http://www.pythonware.com/daily/index.htm
[3] Completa documentación de Python en español:
http://usuarios.lycos.es/arturosa/index.html
[4] Documentación de Python en español de sourceforge:
http://sourceforge.net/projects/pyspanishdoc
[5] Informes interesantes sobre programación (herencia múltiple):
http://www.informit.com/index.asp?session_id={4C573D38-B34A-4B1B-95A1-
A04A8129E780}
[6] Pagina de Zope Corporation: http://www.zope.com
[7] Interesante artículo general sobre Python: http://www.networkcomputing.com
[8] Eckel, Bruce “Thinking in Python, Design Patters and Problem Solving Techniques”
[9] Andrés Marzal “Introducción a la programación en Python”
[10] Pilgrim, Marck. “Dive into Python”
19 PYTHON