Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003

25
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

Transcript of Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003

Page 1: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

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

Page 2: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Información de los autores:

Manuel Casado Martín

[email protected]

Santiago Guadalajara Pérez

[email protected]

Este documento puede ser libremente distribuido.

© 2003 Departamento de Informática y Automática - Universidad de Salamanca.

Page 3: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

PYTHON i

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.

Page 4: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

ii ¡Error! No se encuentra el origen de la referencia.

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.

Page 5: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

PYTHON iii

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

Page 6: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003
Page 7: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

- 1 -

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.

Page 8: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 2

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:

Page 9: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

3 PYTHON

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

Page 10: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 4

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")

Page 11: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

5 PYTHON

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

Page 12: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 6

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)

Page 13: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

7 PYTHON

'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.

Page 14: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 8

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.

Page 15: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

9 PYTHON

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

Page 16: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 10

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.

Page 17: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

11 PYTHON

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__().

Page 18: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 12

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.

Page 19: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

13 PYTHON

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

Page 20: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 14

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:

Page 21: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

15 PYTHON

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...

Page 22: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 16

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>'

Page 23: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

17 PYTHON

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:

Page 24: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

El lenguaje de programación Python

PYTHON 18

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/

Page 25: Programacion orientada a objetos python   manuel casado martín - universidad de salamanca 2003

Casado y Guadalajara

19 PYTHON

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”