Programacion Orientada A Objeto

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 25

La programación orientada a objetos es un enfoque de programación que combina datos y acciones asociadas (métodos) en

estructuras lógicas (objetos). Este enfoque aumenta la capacidad para administrar la complejidad del software, lo cual resulta
especialmente importante cuando se desarrollan y mantienen aplicaciones y estructuras de datos de gran tamaño. (MATLAB,
2018).

La programación Orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que usa
objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.
Está basada en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Su
uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación
que soportan la orientación a objetos. (Ángel Roldán, 2017).

La POO es una forma especial de programar, este paradigma de programación es cercano a como expresamos las cosas en la
vida real en nuestro día a día. Con la POO tenemos que aprender a pensar las cosas de una manera distinta para poder
escribir nuestros programas en términos de objetos, propiedades y métodos. La POO tiene como principio que todo en la vida
es un objeto programable, entonces para empezar a programar con este paradigma tendríamos que empezar con desarrollar
nuestro pensamiento basado en objetos.

¿Cómo pensar en objetos?


Pensar en términos de objetos es pensar de manera natural como lo haríamos en la vida real. Por ejemplo al pensar en un
coche para modelarlo en un esquema de POO. Diríamos que el coche es el elemento principal que tiene una serie de
características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades o métodos
asociados al mismo, como pueden ser ponerse en marcha, parar o acelerar.

En un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los
métodos serían las funcionalidades asociadas como ponerse en marcha o parar.

Los programas Orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos
también son objetos, por ejemplo un taller de coches, el taller de coches será un objeto que utilizará objetos coche,
herramienta, mecánico, recambios, etc.
Algunas de las ventajas de la programación orientada a objetos son los siguientes:

 Los componentes se pueden reutilizar.


 Facilidad de mantenimiento y modificación de los objetos existentes.
 Una estructura modular clara se puede obtener, la cual no revelará el mecanismo detrás del diseño.
 Se proporciona un buen marco que facilita la creación de rica interfaz gráfica de usuario aplicaciones
(GUI).
 Se acopla bien a la utilización de bases de datos, debido a la correspondencia entre las estructuras.

Desventajas

 Limitaciones del programador: Es posible el programador desconozca algunas características del


paradigma y de hecho siga utilizando el paradigma estructurado.
 No hay una forma única de resolver los problemas. Esto puede llevar a que diferentes interpretaciones
de la solución planteada emerjan.
 Se requiere una documentación amplia para determinar la solución planteada.

La programación orienta a objetos es una forma especial de pensar, nos permite modelar nuestra realidad dentro de un entorno
de programación, partiendo de la primicia de que todo en esta vida es un objeto programable.
La programación orientada a objetos (POO, en español; OOP, según sus siglas en inglés) es un paradigma de programación que
viene a innovar la forma de obtener resultados. Los objetos manipulan los datos de entrada para la obtención de datos de salida
específicos, donde cada objeto ofrece una funcionalidad especial.

Muchos de los objetos prediseñados de los lenguajes de programación actuales permiten la agrupación en bibliotecas o librerías, sin
embargo, muchos de estos lenguajes permiten al usuario la creación de sus propias bibliotecas.

Está basada en varias técnicas: herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento.

Su uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación que
soportan la orientación a objetos.

La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como
expresaríamos las cosas en la vida real que otros tipos de programación.

Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas
en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos
y dar una pequeña base que permita soltarnos un poco con este tipo de programación.
Motivación
Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y
otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados
por otras personas se creó la POO. Que es una serie de normas de realizar las cosas de manera que otras
personas puedan utilizarlas y adelantar su trabajo, de manera que consigamos que el código se pueda
reutilizar.

La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de
manera que la forma de hacer las cosas puede ser diferente según el programador. Aunque podamos hacer los
programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino
programar bien. Programar bien es importante porque así nos podemos aprovechar de todas las ventajas de la
POO.

Cómo se piensa en objetos


Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a
pensar en un coche para tratar de modelizarlo en un esquema de POO. Diríamos que el coche es el elemento
principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además
tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar.

Pues en un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el
modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.

Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa
estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2.

La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios
métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, etc.

Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de matemáticas harás uso de
objetos fracción y en un programa que gestione un taller de coches utilizarás objetos coche. Los programas
Orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos
también son objetos. Es decir, el taller de coches será un objeto que utilizará objetos coche, herramienta,
mecánico, recambios, etc.

Clases en POO
Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto
quiere decir que la definición de un objeto es la clase. Cuando programamos un objeto y definimos sus
características y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos
anteriores en realidad hablábamos de las clases coche o fracción porque sólo estuvimos definiendo, aunque
por encima, sus formas.

Propiedades en clases
Las propiedades o atributos son las características de los objetos. Cuando definimos una propiedad
normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de que las propiedades son algo
así como variables donde almacenamos datos relacionados con los objetos.

Métodos en las clases


Son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las llamamos
métodos. Los métodos son como funciones que están asociadas a un objeto.

Objetos en POO
Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar tenemos que especificar la
clase a partir de la cual se creará. Esta acción de crear un objeto a partir de una clase se llama instanciar
(que viene de una mala traducción de la palabra instace que en inglés significa ejemplar). Por ejemplo, un
objeto de la clase fracción es por ejemplo 3/5. El concepto o definición de fracción sería la clase, pero
cuando ya estamos hablando de una fracción en concreto 4/7, 8/1000 o cualquier otra, la llamamos objeto.
Para crear un objeto se tiene que escribir una instrucción especial que puede ser distinta dependiendo el
lenguaje de programación que se emplee, pero será algo parecido a esto.

miCoche = new Coche()

Con la palabra new especificamos que se tiene que crear una instancia de la clase que sigue a continuación.
Dentro de los paréntesis podríamos colocar parámetros con los que inicializar el objeto de la clase coche.

Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un coche la
propiedad color tomará un valor en concreto, como por ejemplo rojo o gris metalizado. El valor concreto de
una propiedad de un objeto se llama estado.

Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador punto.

miCoche.color = rojo

El objeto es miCoche, luego colocamos el operador punto y por último el nombre e la propiedad a la que
deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la propiedad del objeto a rojo
con una simple asignación.

Mensajes en objetos
Un mensaje en un objeto es la acción de efectuar una llamada a un método. Por ejemplo, cuando le decimos a
un objeto coche que se ponga en marcha estamos pasándole el mensaje “ponte en marcha”.

Para mandar mensajes a los objetos utilizamos el operador punto, seguido del método que deseamos invocar.

miCoche.ponerseEnMarcha()

En este ejemplo pasamos el mensaje ponerseEnMarcha(). Hay que colocar paréntesis igual que cualquier
llamada a una función, dentro irían los parámetros.

Otras cosas
Hay mucho todavía que conocer de la POO ya que sólo hemos hecho referencia a las cosas más básicas.
También existen mecanismos como la herencia y el polimorfismo que son unas de las posibilidades más
potentes de la POO.

La herencia sirve para crear objetos que incorporen propiedades y métodos de otros objetos. Así podremos
construir unos objetos a partir de otros sin tener que reescribirlo todo. Puedes encontrar en
DesarrolloWeb.com un artículo completo dedicado a la Herencia.

El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que estamos trabajando, y abstraernos
para definir un código que sea compatible con objetos de varios tipos. Puedes acceder a otro artículo para
saber más sobre Polimorfismo.

Son conceptos avanzados que cuesta explicar en las líneas de ese informe. No hay que olvidar que existen
libros enteros dedicados a la POO y aquí solo pretendemos dar un repaso a algunas cosas para que os suenen
cuando tengáis que poneros delante de ellas en los lenguajes de programación que debe conocer un
desarrollador del web. Sin embargo, si quieres saber más también puedes continuar leyendo en
DesarrolloWeb.com, en el manual de la teoría de la Programación orientada a objetos.

Ejemplo concreto de programación orientada a


objetos
Para conseguir un ejemplo concreto de lo que es la programación orientada a objetos, podemos entrar en
el Manual de PHP 5. Realmente este manual explica las características de orientación a objetos de PHP 5 y
ofrece ejemplos concretos de creación de clases con características como herencia, polimorfismo, etc.
9.3. Programación orientada a objetos
La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de
programación que viene a innovar la forma de obtener resultados. Los objetos manipulan los datos
de entrada para la obtención de datos de salida específicos, donde cada objeto ofrece una
funcionalidad especial.

Muchos de los objetos prediseñados de los lenguajes de programación actuales permiten la


agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes permiten al usuario
la creación de sus propias bibliotecas.

Programación Orientada a Objetos - POO

Está basada en varias técnicas, como las siguientes:

 herencia.
 cohesión.

 abstracción.

 polimorfismo.
 acoplamiento.

 encapsulación.

La POO tiene sus raíces en la década del 60 con el lenguaje de programación Simula que en

1967, el cual fue el primer lenguaje que posee las características principales de un lenguaje
orientado a objetos.

Smalltalk (de 1972 a 1980) es posiblemente el ejemplo canónico, y con el que gran parte de la
teoría de la POO se ha desarrollado. Más su uso se popularizó a principios de la década de 1990.

En la actualidad, existe una gran variedad de lenguajes de programación que soportan la


orientación a objetos.

Los objetivos de la POO son:

 Organizar el código fuente, y


 re-usar código fuente en similares contextos.

Nota

Más información consulte el articulo de Wikipedia Programación orientada a objetos.

9.3.1. POO en Python

El mecanismo de clases de Python agrega clases al lenguaje con un mínimo de nuevas sintaxis y
semánticas.

En Python las clases es una mezcla de los mecanismos de clase encontrados en C++ y Modula-3.

Como es cierto para los módulos, las clases en Python no ponen una barrera absoluta entre la
definición y el usuario, sino que más bien se apoya en la cortesía del usuario de no “forzar la
definición”.

Sin embargo, se mantiene el poder completo de las características más importantes de las clases:
el mecanismo de la herencia de clases permite múltiples clases base, una clase derivada puede
sobrescribir cualquier método de su(s) clase(s) base, y un método puede llamar al método de la
clase base con el mismo nombre.

“Los objetos pueden tener una cantidad arbitraria de datos.”

En terminología de C++, todos los miembros de las clases (incluyendo los miembros de datos),

son públicos, y todas las funciones miembro son virtuales.


Como en Modula-3, no hay atajos para hacer referencia a los miembros del objeto desde sus

métodos: la función método se declara con un primer argumento explícito que representa al
objeto, el cual se provee implícitamente por la llamada.

Como en Smalltalk, las clases mismas son objetos. Esto provee una semántica para importar y

renombrar.

A diferencia de C++ y Modula-3, los tipos de datos integrados pueden usarse como clases base

para que el usuario los extienda.

También, como en C++ pero a diferencia de Modula-3, la mayoría de los operadores integrados

con sintaxis especial (operadores aritméticos, de subíndice, etc.) pueden ser redefinidos por
instancias de la clase.

(Sin haber una terminología universalmente aceptada sobre clases, haré uso ocasional de términos
de Smalltalk y C++. Usaría términos de Modula-3, ya que su semántica orientada a objetos es
más cercana a Python que C++, pero no espero que muchos lectores hayan escuchado hablar de

él).

Algunas particularidades de POO en Python son las siguientes:

 Todo es un objeto, incluyendo los tipos y clases.


 Permite herencia múltiple.

 No existen métodos ni atributos privados.

 Los atributos pueden ser modificados directamente.

 Permite “monkey patching”.

 Permite “duck typing”.

 Permite la sobrecarga de operadores.

 Permite la creación de nuevos tipos de datos.

A continuación se procede a definir algunos conceptos necesarios para entender la POO:

9.3.2. Objetos

Los objetos son abstracción de Python para data. Toda la data en un programa Python es
representado por objectos o por relaciones entre objectos. (En cierto sentido, y en el código
modelo de Von Neumann de una “computadora almacenada del programa” también es un código
representado por los objetos.)
Cada objeto tiene una identidad, un tipo y un valor. Una identidad de objecto nunca cambia una
vez es creada; usted puede pensar eso como la dirección de objeto en memoria. El
operador in compara la identidad de dos objetos; la función id() devuelve un número entero
representando la identidad (actualmente implementado como su dirección).

El tipo de un objeto también es inmutable. El tipo de un objeto determina las operaciones que
admite el objeto (por ejemplo, “¿tiene una longitud?”) Y también define los valores posibles para
los objetos de ese tipo. La función “type()” devuelve el tipo de un objeto (que es un objeto en sí
mismo). El valor *de algunos objetos puede cambiar. Se dice que los objetos cuyo valor puede
cambiar son *mutables; los objetos cuyo valor no se puede cambiar una vez que se crean se
llaman immutable. (El valor de un objeto contenedor inmutable que contiene una referencia a un
objeto mutable puede cambiar cuando se cambia el valor de este último; sin embargo, el
contenedor todavía se considera inmutable, porque la colección de objetos que contiene no se
puede cambiar. Por lo tanto, la inmutabilidad no es estrictamente lo mismo que tener un valor
incambiable, es más sutil.) La mutabilidad de un objeto está determinada por su tipo; por ejemplo,
los números, las cadenas y las tuplas son inmutables, mientras que los diccionarios y las listas son
mutables.

Los objetos son la clave para entender la POO. Si mira a nuestro alrededor encontrará un sin fin de
objetos de la vida real: perro, escritorio, televisor, bicicleta, etc...

En Python puede definir una clase con la palabra reservada class, de la siguiente forma:

class Persona:

pass

En el ejemplo anterior, el nombre de la clase es Persona y dentro del bloque de código usa la

sentencia pass. Aunque no es requerido por el intérprete, los nombres de las clases se escriben por
convención capitalizadas. Las clases pueden (y siempre deberían) tener comentarios.
Diagrama de Objeto Persona

9.3.2.1. Estado de un objeto

El conjunto de datos y objetos relacionados con un objeto en un momento dado, se le conoce como
“estado”. Un objeto puede tener múltiples estados a lo largo de su existencia conforme se
relaciona con su entorno y otros objetos.

Por hacer

TODO explicar el concepto Estado de un objeto.

9.3.3. Atributos

Los atributos o propiedades de los objetos son las características que puede tener un objeto, como
el color. Si el objeto es Persona, los atributos podrían ser: cedula, nombre, apellido, sexo,

etc...

Los atributos describen el estado de un objeto. Pueden ser de cualquier tipo de dato.

class Persona:

"""Clase que representa una Persona"""

cedula = "V-13458796"

nombre = "Leonardo"
apellido = "Caballero"

sexo = "M"

Usted puede probar el código anterior, si lo transcribe en el consola interactiva Python como lo
siguiente:

>>> class Persona:

... """Clase que representa una Persona"""

... cedula = "V-13458796"

... nombre = "Leonardo"

... apellido = "Caballero"

... sexo = "M"

...

>>> macagua = Persona

>>> type(macagua)

<type 'classobj'>

>>> dir(macagua)

['__doc__', '__module__', 'apellido', 'cedula', 'nombre', 'sexo']

>>> macagua.cedula

'V-13458796'

>>> macagua.nombre

'Leonardo'

>>> macagua.apellido

'Caballero'

>>> macagua.sexo

'M'

>>> print "El objeto de la clase " + macagua.__name__ +"," \

... + macagua.__doc__ + "."

El objeto de la clase Persona, Clase que representa una Persona.

>>> print "Hola, mucho gusto, mi nombre es '"+ \

... macagua.nombre +" "+ \

... macagua.apellido +"', \nmi cédula de identidad es '"+ \


... macagua.cedula +"', y mi sexo es '"+ \

... macagua.sexo +"'."

Hola, mucho gusto, mi nombre es 'Leonardo Caballero',

mi cédula de identidad es 'V-13458796', y mi sexo es 'M'.

Si el nombre de un atributo esta encerrado entre dobles guiones bajos son atributos especiales.

 __name__, describe el nombre del objeto o del método.

>>> macagua.__name__

'Persona'

 __doc__, contiene la documentación de un módulo, una clase, o método especifico, escrita

en el formato docstrings.

>>> macagua.__doc__

'Clase que representa una Persona'

Si el nombre de un atributo esta con dobles guiones bajos al principio son atributos “escondidos”.
A continuación un pseudo código que ilustra un ejemplo:

>>> ms_windows.__privado

'True'

>>> ms_windows.codigo_fuente.__no_tocar

'True'

En la sección encapsulación se describe esto a más profundidad.

9.3.4. Métodos

Los métodos describen el comportamiento de los objetos de una clase. Estos representan las
operaciones que se pueden realizar con los objetos de la clase,

La ejecución de un método puede conducir a cambiar el estado del objeto.

Se definen de la misma forma que las funciones normales pero deben declararse dentro de la clase
y su primer argumento siempre referencia a la instancia que la llama, de esta forma se afirma que
los métodos son funciones, adjuntadas a objectos.

Nota
Usted puede encontrar ejemplos en las funciones de cadena de caracteres, listas, diccionarios, etc.

Si el objeto es Persona, los métodos pueden ser: hablar, caminar, comer, dormir, etc.

class Persona:

"""Clase que representa una Persona"""

cedula = "V-13458796"

nombre = "Leonardo"

apellido = "Caballero"

sexo = "M"

def hablar(self, mensaje):

"""Mostrar mensaje de saludo de Persona"""

return mensaje

La única diferencia sintáctica entre la definición de un método y la definición de una función es que
el primer parámetro del método por convención debe ser el nombre self.

Usted puede probar el código anterior, si lo transcribe en el consola interactiva Python como lo
siguiente:

>>> class Persona:

... """Clase que representa una Persona"""

... cedula = "V-13458796"

... nombre = "Leonardo"

... apellido = "Caballero"

... sexo = "M"

...

... def hablar(self, mensaje):

... """Mostrar mensaje de saludo de Persona"""

... return mensaje

...

>>>

>>> macagua = Persona


>>> Persona().hablar("Hola, soy la clase {0}.".format(

... macagua.__name__))

'Hola, soy la clase Persona.'

>>> type(Persona().hablar)

<type 'instancemethod'>

>>> Persona().hablar.__doc__

'Mostrar mensaje de saludo de Persona'

Si crea una instancia de objeto para la clase Persona e intenta llamar al método hablar() esto

lanzara una excepción TypeError, como sucede a continuación:

>>> macagua = Persona

>>> macagua.hablar("Hola Plone")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unbound method hablar() must be called with Persona instance as first argument (got str

instance instead)

Esto sucede por...

Por hacer

TODO explicar por que se lanza la excepción TypeError.

9.3.4.1. Ámbito de los métodos

Los métodos cuentan con un espacio de nombres propio. En caso de no encontrar un nombre en su
ámbito local, buscará en el ámbito superior hasta encontrar alguna coincidencia.

Los métodos pueden acceder y crear atributos dentro del objeto al que pertenecen, anteponiendo
la palabra self y el operador de atributo ”.” antes del nombre del atributo en cuestión.

9.3.4.2. Métodos especiales

Las clases en Python cuentan con múltiples métodos especiales, los cuales se encuentran entre
dobles guiones bajos __<metodo>__().

Los métodos especiales más utilizados son __init__(), __str__() y __del__().


9.3.4.2.1. __str__()

El método __str__() es un método especial, el cual se ejecuta al momento en el cual un objeto

se manda a mostrar, es decir es una cadena representativa de la clase, la cual puede incluir
formatos personalizados de presentación del mismo.

def __str__(self):

"""Devuelve una cadena representativa de Persona"""

return "%s: %s, %s %s, %s." % (

self.__doc__[25:34], str(self.cedula), self.nombre,

self.apellido, self.getGenero(self.sexo))

9.3.4.2.2. __del__()

El método __del__() es un método especial, el cual se ejecuta al momento en el cual un objeto


es descartado por el intérprete. El comportamiento de __del__() es muy similar a los

“destructores” en otros lenguajes.

9.3.4.3. Métodos de clase

En ocasiones es necesario contar con métodos que interactúen con elementos de la clase de la
cual el objeto es instanciado. Python permite definir métodos de clase para esto.

Los métodos de clase son aquellos que están ligados directamente con los atributos definidos en la
clase que los contiene. Para definir un método de clase se utiliza el decorador @classmethod y
por convención se utiliza cls como argumento inicial en lugar de self.

Del mismo modo, los métodos de clase utilizan el prefijo cls para referirse a los atributos de la

clase.

class <Clase>(object):

...

...

@classmethod

def <metodo>(cls, <argumentos>):

...

...
9.3.4.4. Métodos estáticos

Los métodos estáticos hacen referencia a las instancias y métodos de una clase. Para definir un
método estático se utiliza el decorador @staticmethod y no utiliza ningún argumento inicial.

Al no utilizar self, los métodos estáticos no pueden interactuar con los atributos y métodos de la

instancia.

Para referirse a los elementos de la clase, se debe utilizar el nombre de la clase como prefijo.

class <Clase>(object):

...

...

@staticmethod

def <metodo>(<argumentos>):

...

...

9.3.4.5. Interfaces

La forma en que los métodos de un objeto pueden ser accedidos por otros objetos se conoce como
“interfaz”. Una interfaz bien definida permite a objetos de distinta índole interactuar entre sí de
forma modular. La interfaz define el modo en que los objetos intercambian información.

Por hacer

TODO explicar el concepto de Interfaces.

9.3.4.6. Implementaciones

Una implementación corresponde al mecanismo interno que se desencadena en un método


cuando éste es llamado. Las implementaciones procesan las entradas proveniente de las
interfaces y actúan en consecuencia ya sea:

 Modificando el estado del objeto.


 Transfiriendo la información resultante del proceso interno a través de la interfaces.

Por hacer

TODO explicar el concepto de Implementaciones.


9.3.5. Clases

Las clases definen las características del objeto.

Con todos los conceptos anteriores explicados, se puede decir que una clase es una plantilla
genérica de un objeto. La clase proporciona variables iniciales de estado (donde se guardan
los atributos) e implementaciones de comportamiento (métodos) necesarias para crear nuevos
objetos, son los modelos sobre los cuáles serán construidos.

9.3.6. Instancias

Ya sabe que una clase es una estructura general del objeto. Por ejemplo, puede decir que la
clase Persona necesita tener una cedula, un nombre, un apellido y una sexo, pero no va a
decir cual es cedula, nombre, apellido y sexo, es aquí donde entran las instancias.

Una instancia es una copia específica de la clase con todo su contenido. Por ejemplo:

>>> persona1 = Persona("V-13458796", "Leonardo", "Caballero", "M")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: this constructor takes no arguments

La excepción TypeError indica que el método constructor no toma argumentos, esto se debe a que
la momento de definir la clase a cada atributo se le asigno un valor (tipo de dato).

Usted puede definir el metodo constructor de la clase usando el método __init__().

9.3.6.1. Método __init__()

El método __init__() es un método especial, el cual se ejecuta al momento de instanciar un


objeto. El comportamiento de __init__() es muy similar a los “constructores” en otros
lenguajes. Los argumentos que se utilizan en la definición de __init__() corresponden a los

parámetros que se deben ingresar al instanciar un objeto.

def __init__(self, cedula, nombre, apellido, sexo):

"""Constructor de clase Persona"""

self.cedula = cedula

self.nombre = nombre

self.apellido = apellido

self.sexo = sexo
9.3.6.2. Función isinstance()

isinstance(), es una función integrada la cual le permite corroborar si un objeto es instancia


de una clase.

Nota

Más información consulte la documentación detallada de la función isinstance().


Importante

Usted puede descargar el código usado en esta sección haciendo clic aquí.
Truco

Para ejecutar el código poo.py, abra una consola de comando, acceda al directorio donde se

encuentra el mismo, y ejecute el siguiente comando:

python poo.py

Técnicas de prototipos y desarrollo rápido:

El diseño de prototipos es una popular técnica de ingeniería utilizada para desarrollar modelos a escala (o

simulados) de un producto o de sus componentes, cuando se aplica al desarrollo de sistemas de información,

el diseño de prototipos implica la creación de un modelo interactivo de trabajo de un sistema o subsistema.

La técnica de prototipos puede utilizarse en varias fases del ciclo de vida.

Existen cuatro tipos de prototipos de sistemas de información:

• Los prototipos de vialidad se utilizan para probar la vialidad de una tecnología específica aplicable a un

sistema de información.

• Los prototipos de necesidades (a veces denominados de descubrimiento) se utilizan para descubrir las

necesidades de los usuarios con respecto a la empresa. Pueden simular la forma de pensar de los usuarios. Su

base es sencilla: los usuarios reconocerán sus necesidades cuando las vean, durante la elaboración de

diseños de necesidades, el analista puede pintar pantallas o informes de muestra, y solicitar las opiniones del

usuario con respecto a su contenido.

• Los prototipos de diseño (a veces denominados prototipos de comportamiento) se utilizan para simular el

diseño del sistema de información final. Mientras que los prototipos de necesidades se centraban solo en el

contenido, los prototipos de diseño lo hacen en la forma y funcionamiento del sistema deseado. Cuando un

analista crea un prototipo de diseño, espera que los usuarios evalúen dicho prototipo como si formara parte

del sistema final. Así, los usuarios deberían evaluar la facilidad de aprendizaje y de manejo del sistema, así

como el aspecto de pantallas y los informes y los procedimientos requeridos para utilizar el sistema. Estos

prototipos pueden servir como especificaciones parciales de diseño o evolucionar hacia prototipos de

implantación.
• Los prototipos de implantación (a veces denominados prototipos de producción) constituyen una extensión

de los prototipos de diseño donde el prototipo evoluciona directamente hacia el sistema de producción. En

principio, los prototipos de implantación omiten normalmente detalles como la edición de datos, las

seguridades y los mensajes de ayuda. Estos detalles pueden añadirse posteriormente, si se desea que el

prototipo evolucione hacia un sistema de producción.

Las ventajas que se obtienen del uso de prototipos son numerosas:

• Los usuarios se hacen participantes más activos en el desarrollo de sistemas. Suelen mostrarse más

interesados en los prototipos de trabajo que en las especificaciones de diseño en papel.

• La definición de necesidades se simplifica por el hecho de que muchos usuarios finales no comprenden o no

son capaces de enunciar detalladamente sus necesidades hasta que ven un prototipo.

• La probabilidad de que los usuarios finales aprueben un diseño y luego rechacen su implantación se reducirá

notablemente .

• Según se dice, el diseño mediante prototipo reduce el tiempo de desarrollo, sin embargo, algunos expertos

cuestiona este ahorro de tiempo.

Pero para la utilización de prototipos comporta también un riesgo, se suele pasar a las fases de análisis y

diseño con demasiada rapidez. Ello empuja al analista a pasar demasiado rápido a la codificación, sin haber

comprendido bien las necesidades y los problemas.

Programación Orientadas a objetos:

La Programación Orientada a Objetos (POO u OOP) es un paradigma de programación que define los

programas en términos de “clases de objetos”, objetos que son entidades que combinan estado (propiedades o

datos), comportamiento (procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del

resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que

colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir,

mantener y reutilizar.

Elementos de la POO:

-. Objetos: contienen toda la información que permite definirlo e identificarlo frente a otros objetos

pertenecientes a otras clases (e incluso entre objetos de una misma clase, al poder tener valores bien

diferenciados en sus atributos).

A su vez, dispone de mecanismos de interacción (los llamados métodos) que favorecen la comunicación entre

objetos (de una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos.
Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan (ni deben separarse)

información (datos) y procesamiento (métodos).

-. Atributos: Los atributos son las características individuales que diferencian un objeto de otro y determinan

su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y

cada objeto particular puede tener valores distintos para estas variables.

Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores

son fijados y cambiados en el objeto.

Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus

instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.

-.Mensajes: Corresponde a la forma que tienen los objetos para comunicarse entre sí, de esta forma, el objeto

que activa el mensaje se llama objeto emisor y el que lo recibe objeto receptor. Cabe señalar que un mensaje

debe ser activado o generado desde un método hacia un objeto. En términos generales equivale a la llamada a

un procedimiento o función.

Forma general de un mensaje:

receptor_mensaje.selector_mensaje [(parámetros)]

p/e ventana_editor.maximizar; documento1.imprimir(2);

-. Clases: son declaraciones o abstracciones de objetos, lo que significa, que una clase es la definición de un

objeto. Cuando se programa un objeto y se definen sus características y funcionalidades, realmente se

programa una clase.

Para crear una clase se utiliza la palabra reservada class y a continuación el nombre de la clase. La definición

de la clase se pone entre las llaves de apertura y cierre. El nombre de la clase empieza por letra mayúscula.

class Rectangulo{

//miembros dato

//funciones miembro

-.Instanciación: una instancia se produce con la creación de un objeto perteneciente a una clase (se dice que

se instancia la clase). El objeto que se crea tiene los atributos, propiedades y métodos de la clase a la que

pertenece. Los objetos y sus características se usan en la construcción de programas, ya sea como

contenedores de datos o como partes funcionales del programa.

Características del POO:

-. Abstracción: Mediante la abstracción la mente humana modeliza la realidad en forma de objetos. Para ello
busca parecidos entre la realidad y la posible implementación de objetos del programa que simulen el

funcionamiento de los objetos reales.

Los seres humanos no pensamos en las cosas como un conjunto de cosas menores; por ejemplo, no vemos un

cuerpo humano como un conjunto de células. Los humanos entendemos la realidad como objetos con

comportamientos bien definidos. No necesitamos conocer los detalles de porqué ni cómo funcionan las cosas;

simplemente solicitamos determinadas acciones en espera de una respuesta; cuando una persona desea

desplazarse, su cuerpo le responde comenzando a caminar.

Pero la abstracción humana se gestiona de una manera jerárquica, dividiendo sucesivamente sistemas

complejos en conjuntos de subsistemas, para así entender más fácilmente la realidad. Esta es la forma de

pensar que la orientación a objeto intenta cubrir.

-. Encapsulamiento: Uno de los objetivos primordiales de la P.O.O., es la creación de objetos que funcionen

como entidades complejas, es decir autosuficientes, una de las reglas del encapsulamiento es que el

programador nunca necesita acceder directamente a los datos de un objeto, en vez de esto se deben definir

métodos dentro del objeto que gobiernen toda la manipulación de datos. El encapsulamiento está referido,

también, a los métodos de cada objeto en el sentido que su código interno debe ser transparente a la hora de

activarse.

-.Polimorfismo: Se refiere a la capacidad que tiene el objeto para hacer lo adecuado después de haber recibido

un mensaje, independientemente de quién lo haya enviado. Hay que tener en cuenta que el polimorfismo se

mueve a través de la herencia, dicho de otra forma trata de hacer posible enviar mensajes genéricos a objetos

y que éstos realicen lo estipulado de acuerdo a su codificación interna, es decir, la acción varía en relación al

receptor del mensaje.

Ejemplo: Se desea enviar un mensaje a dos objetos distintos (Triángulo y Rectángulo) los cuales podrían ser

descendientes de la clase polígono, sin embargo cuando el triángulo reciba la orden área, la ejecución de este

método se obtendrá a partir de (b*h)/2 en cambio si se activa el mismo método para el rectángulo el valor se

calculará a partir de ð *r2 , aún cuando ambos objetos recibieron la misma orden.

-. Herencia: En términos simples la herencia en la P.O.O. es la capacidad que tiene los objetos para heredar

todas o algunas de sus características (datos) y comportamiento (procedimientos) a sus descendientes o

herederos, permitiendo así la reutilización de código lo que en la práctica se traduce en una herramienta muy

potente de programación.

Esta herencia puede ser a nivel de estado (características) o protocolo (métodos y procedimientos) o ambas.

La herencia en la P.O.O tiene sus raíces en el concepto de registros anidados.

Ejemplo:

Type

edades: 0..150;

InfPersona = RECORD

Apellido: integer;

Nombre: integer;

Edad: edades;

end;
grados: 0..12;

InfEstudiante= RECORD

persona: InfPersona;

grado: Grados;

Profesor: string (30);

end;

El registro InfPersona contiene campos que se utilizan para describir a cualquier persona. El segundo registro

InfEstudiante, incluye el campo Persona, que contiene los campos del registro InfPersona. En la P.O.O., se

utiliza el mismo concepto para construir incrementalmente objetos que son capaces de heredar algunas o

todas las características de sus ascendientes (objetos padres).

Técnicas de Prototipos y desarrollo rápido

Los prototipos son una visión preliminar del sistema futuro que se implantara. La elaboración de prototipos de un sistema de información es una
técnica valiosa para la recopilación rápida de información especifica a cerca de los requerimientos de información de los usuarios. Los prototipos
efectivos deben hacerse tempranamente en el ciclo de vida del desarrollo de sistemas, durante la fase de determinación de requerimientos.

El desarrollo rápido de aplicaciones o RAD (acrónimo en inglés de rapid application development) es un proceso de desarrollo de software,
desarrollado inicialmente por James Martin en1980. El método comprende el desarrollo interactivo, la construcción de prototipos y el uso de
utilidades CASE (Computer Aided Software Engineering). Tradicionalmente, el desarrollo rápido de aplicaciones tiende a englobar también la
usabilidad, utilidad y la rapidez de ejecución.

Caracteristicas de P.O.O
Características de la POO

Hay un cierto desacuerdo sobre exactamente qué características de un método de


programación o lenguaje le definen como “orientado a objetos”, pero hay un consenso general
en que las características siguientes son las más importantes (para más información, seguir los
enlaces respectivos):

Abstracción: Cada objeto en el sistema sirve como modelo de un “agente” abstracto que puede
realizar trabajo, informar y cambiar su estado, y “comunicarse” con otros objetos en el sistema
sin revelar cómo se implementan estas características. Los procesos, las funciones o los
métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son
requeridas para ampliar una abstracción.
Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse
pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar
la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el
principio de ocultación, principalmente porque se suelen emplear conjuntamente.

Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo
de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los
objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su
modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos
internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden
cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos
secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un
acceso directo a los datos internos del objeto de una manera controlada y limitando el grado
de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el


mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al
objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos
pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una
referencia producirá el comportamiento correcto para el tipo real del objeto referenciado.
Cuando esto ocurre en “tiempo de ejecución”, esta última característica se llama asignación
tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en
“tiempo de compilación”) de polimorfismo, tales como las plantillas y la sobrecarga de
operadores de C++.

Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía
de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a
las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento
permitiendo a los objetos ser definidos y creados como tipos especializados de objetos
preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a
implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas
en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de
más de una clase se dice que hay herencia múltiple. (4)

Conceptos Básicos de POO


Se puede hablar de Programación Orientada a Objetos cuando se reúnen las características
de: abstracción, encapsulación, herencia y polimorfismo; y los conceptos básicos que las
forman: objetos, mensajes, clases, instancias y métodos.

Conceptos Básicos:
 Un objeto es una encapsulación abstracta de información, junto con los métodos o procedimientos para manipularla. Un objeto

contiene operaciones que definen su comportamiento y variables que definen su estado entre las llamadas a las operaciones.

 Una clase equivale a la generalización o abstracción de un tipo específico de objetos.

 Un mensaje representa una acción a tomar por un determinado objeto.

 Una instancia es la concrección de una clase.

 Un método consiste en la implementación en una clase de un protocolo de respuesta a los mensajes dirigidos a los objetos de

la misma. La respuesta a tales mensajes puede incluir el envío por el método de mensajes al propio objeto y aun a otros, también como

el cambio del estado interno del objeto.

Características:

La abstracción: Consiste en la generalización conceptual de un determinado conjunto de objetos y de sus atributos y propiedades,

dejando en un segundo término los detalles concretos de cada objeto. ¿Qué se consigue con la abstracción? Bueno, básicamente pasar del

plano material (cosas que se tocan) al plano mental (cosas que se piensan).

La encapsulación: Se refiere a la capacidad de agrupar y condensar en un entorno con límites bien-definidos distintos elementos. Cuando

hablemos de encapsulación en general siempre nos referiremos, pues, a encapsulación abstracta. De manera informal, primero

generalizamos (la abstracción) y luego decimos: la generalización está bien, pero dentro de un cierto orden: hay que poner límites (la

encapsulación), y dentro de esos límites vamos a meter, a saco, todo lo relacionado con lo abstraído: no sólo datos, sino también métodos,

comportamientos, etc.

Por un lado es una abstracción pues, de acuerdo con la definición establecida anteriormente, es en ésta donde se definen las propiedades y

atributos genéricos de determinados objetos con características comunes (recordemos el ejemplo de la sala de cine). La Clase es, por otro

lado, una encapsulación porque constituye una cápsula o saco que encierra y amalgama de forma clara tanto los datos de que constan los

objetos como los procedimientos que permiten manipularlos. Las Clases se constituyen, así, en abstracciones encapsuladas.

La herencia: Se aplica sobre las clases. O sea, de alguna forma las clases pueden tener descendencia, y ésta heredará algunas

características de las clases “padres”. Si disponemos las clases con un formato de árbol genealógico, tenderemos lo que se denomina una

estructura jerarquizada de clases.

La OOP promueve en gran medida que las relaciones entre objetos se basen en construcciones jerárquicas. Esto es, las clases pueden

heredar diferencialmente de otras clases (denominadas “superclases”) determinadas características, mientras que, a la vez, pueden definir

las suyas propias. Tales clases pasan, así, a denominarse “subclases” de aquéllas.

La herencia se implementa mediante un mecanismo que se denomina derivación de clases: las superclases pasan a llamarse clases base,

mientras que las subclases se constituyen en clases derivadas. El mecanismo de herencia está fuertemente entroncado con la reutilización

del código en OOP. Una clase derivada posibilita, el fácil uso de código ya creado en cualquiera de las clases base ya existentes.

El concepto de herencia constituye un estrato básico del paradigma de objetos, pero esto no significa que todas las relaciones entre clases

en OOP deban ajustarse siempre a este modelo jerárquico. Es necesario establecer si la pretendida relación entre objetos es de pertenencia

o de derivación. En una relación típica de pertenencia un objeto contiene al otro


Polimorfismo: Esta propiedad, como su mismo nombre sugiere múltiples formas, se refiere a la posibilidad de acceder a un variado rango

de funciones distintas a través del mismo interfaz. O sea, que, en la práctica, un mismo identificador puede tener distintas formas (distintos

cuerpos de función, distintos comportamientos) dependiendo, en general, del contexto en el que se halle inserto.

El polimorfismo se puede establecer mediante la sobrecarga de identificadores y operadores, la ligadura dinámica y las funciones virtuales.

El término sobrecarga se refiere al uso del mismo identificador u operador en distintos contextos y con distintos significados.

La sobrecarga de funciones conduce a que un mismo nombre pueda representar distintas funciones con distinto tipo y número de

argumentos. En el ámbito de la OOP, la sobrecarga de funciones equivale a que un mismo mensaje puede ser enviado a objetos de

diferentes clases de forma que cada objeto respondería al mensaje apropiadamente.

La sobrecarga de operadores permite, por otro lado, el desarrollo de un código más coherente, como especialización de la sobrecarga de

funciones, posibilitando la re-definición (para tipos de datos definidos-por-el-usuario) de las operaciones realizadas por éstos (+, -, *, >,

etc.). Esto es, ocurre lo mismo que en la sobrecarga de funciones, pero aquí, en vez de identificadores de funciones, tenemos operadores.

Gracias a la ligadura dinámica, pueden invocarse operaciones en objetos obviando el tipo actual del éstos hasta el momento de la ejecución

del código. (6)

Características de la P.O.O.:

No hay un acuerdo aceptado por todo el mundo respecto a cuáles son las
características que definen la POO, pero al menos todos concuerdan en
estas tres:

1. Abstracción.
2. Encapsulación.
3. Herencia.

Abstracción:

Cada vez que pronunciamos una palabra, realmente lo que hacemos es


asociar ese sonido (o ese conjunto de garabatos al escribir) con una serie
de cosas. Decimos que una ave es tal cosa, que una silla es tal otra, etc.

Cuando vamos a aplicar la POO, lo primero que debemos hacer es cumplir


con una vieja máxima de guerra: Divide y Vencerás. Es decir, lo que
hacemos es seccionar nuestro código en grupos de código más pequeño
que, al unirlos, hacen el trabajo. Un buen ejemplo de abstracción es el
cuerpo humano, aunque el cuerpo es una unidad, está dividido en lo que
conocemos por sistemas (el sistema respiratorio, el sistema linfático,
cardiovascular, etc., etc.). Estos sistemas, a su vez están compuestos por
otros más pequeños: los órganos, y así sucesivamente. La abstracción nos
permite dividir nuestro programa en distintos objetos que se agrupan para
formar cosas más complejas.

Pero ¿qué demonios es realmente la abstracción? Básicamente es la


capacidad de separar los elementos (al menos mentalmente) para poder
verlos de forma singular. Como cuando describimos el cuerpo humano y
decimos cabeza, brazo(s), pierna(s), etc.

Encapsulación:

También conocida como ocultamiento. Cuando me acuesto a ver televisión


no me preocupo del modo como éste funciona, o lo que hace para cambiar
de canal o aumentar el volumen. A menos que seas experto en electrónica o
técnico en televisores, te pasará lo mismo: no lo sabes y no te importa;
sólo sabes que al presionar un botón ocurre la magia.

La encapsulación se encarga de mantener ocultos los procesos internos que


necesita para hacer lo que sea que haga, dándole al programador
acceso sólo a lo que necesita. Esto da dos ventajas iniciales: Lo que hace
el usuario puede ser controlado internamente (incluso sus errores),
evitando que todo colapse por una intervención indeseada (tú no quieres
que tu mamá, que no tiene ni idea de electrónica, abra tu televisor y
empiece a jugar con los circuitos para cambiar los
canales manualmente ¿verdad?). La segunda ventaja es que, al hacer que
la mayor parte del código esté oculto, puedes hacer cambios y/o mejoras
sin que eso afecte el modo como los usuarios van a utilizar tu código. Sólo
tienes que mantener igual la forma de acceder a él (en el caso del control
de la tele, que los botones sigan siendo los mismos y que el botón de
“apagado” no cambie el volumen). Por cierto, estas puertas de acceso que
das a los usuarios son lo que se conoce como interfaz.

Herencia:

Uno de los elementos (a mi modo de ver) más interesantes de la P.O.O. La


herencia es la capacidad que tiene una clase de derivar las propiedades y
métodos de otra (suena a chino ¿no? Calma, lo veremos luego con
paciencia ). Tratemos de explicarlo con un ejemplo:
Decimos que una gallina es un ave; esto quiere decir que las gallinas tienen
características comunes con otras aves (pico, plumas, etc.), es decir que la
gallina hereda las características comunes de todas las aves. Pero además,
resulta que un ave es un animal, lo que significa que también comparte
características comunes al caballo, el perro, el hombre (seeee, somo
animales) y cualquier otra cosa que pueda ser clasificada como animal.

La herencia nos permite, entre otras cosas, evitar tener que escribir el
mismo código una y otra vez, puesto que al definir que una categoría (que
en programación llamaremos clase) pertenece a otra, automáticamente
estamos atribuyéndoles las características generales de la primera, sin
tener que definirlas de nuevo.(7)

También podría gustarte