Mejor explicación de la programación orientada a objetos con código Python

La mejor explicación en código Python sobre la Programación Orientada a Objetos (POO)

 Voy a intentar explicar lo que es la programación orientada a objetos, mediante programación orientada a objetos. Escribo código Python usando el paradígma de programación orientado a objetos, con el uso del encapsulamiento, herencia, abstracción y polimorfismo.


class Encapsulamiento:
"""
Lo puedes utilizar cuando deseas que ciertos métodos o propiedades sean
inviolables o inalterables.
Cada objeto es responsable de su propia información y de su propio estado,
la única forma de que la información se pueda modificar, es mediante los
mismos métodos del objeto. por lo tanto, los atributos internos de un
objeto deberían ser inaccesibles desde fuera, pudiéndolos modificar solo
llamando a las funciones correspondientes.

Con esto conseguimos mantener a salvo el estado de usos indebidos que
puedan ocasionar resultados inesperados.
"""
def __init__(self):
self.__esta_propiedad_es_inalterable_desde_afuera = 'inalterable'
def solo_este_metodo_puede_modificar_la_propiedad_inalterable(self, valor):
if not valor in ('inviolable', 'inalterable'):
raise ValueError('El valor solo debe ser inalterable o inviolable')
self.__esta_propiedad_es_inalterable_desde_afuera = valor


class Herencia:
"""
Nos permite crear nuevas clases a partir de otras. Si tuviéramos una clase
“Autos” y quisiéramos crear unas clases “Auto deportivo” o “Auto clásico”,
podríamos tomar varias propiedades y métodos de la clase “Autos”.
Esto nos da una jerarquía de padre e hijo.
"""
todos_mis_hijos_heredaran_esta_propiedad = True
def todos_mis_hijos_heredaran_este_metodo(self):
return True

class Abstraccion:
"""
Es cuando separamos los datos de un objeto para luego generar un molde.
Este principio se puede definir como las características específicas del
objeto, los mismos que lo distinguen de los demás tipos de objetos.

La abstracción consiste en separar un elemento de su contexto o del resto
de elementos que lo acompañan. Es un principio por el cual se descarta
toda aquella información que no resulta relevante en un contexto en
particular, enfatizando en alguno de los detalles o propiedades de los
objetos. Depende principalmente del interés del observador, permitiendo
abstracciones muy diferentes de la misma realidad.
"""

@classmethod
def este_metodo_hace_algo_especifico_y_propio_de_mi(cls):
'''No escribas este mismo código en otro lado.
Si necesitas lo que hago, puedes usarme así:
Abstraccion.este_metodo_hace_algo_especifico_y_propio_de_mi()
'''
print('Yo hago algo específico. No dupliques código.')

class Polimorfismo:
"""
Se utiliza para crear métodos con el mismo nombre pero con diferente
comportamiento. Proviene de Poli = muchas, morfismo = formas.
En informática el polimorfismo es considerado uno de los elementos más
importantes dentro la programación orientada a objetos POO, ya que su
definición está fuertemente ligada a la Herencia.

Como definición el polimorfismo es la habilidad de un objeto de realizar
una acción de diferentes maneras, utilizando métodos iguales que se
implementen de forma diferente en varias clases.
"""
def __init__(self, idioma):
self.idioma = idioma
def este_metodo_se_comporta_distinto_segun_el_idioma(self):
if self.idioma == "es":
print('Yo soy Polimorfismo.')
elif self.idioma == "en":
print('I am polymorphism')
else:
raise ValueError('No reconozco el idioma %s' % self.idioma)


class ParadigmaDeProgramacion:
"""
Formas de clasificar los lenguajes de programación en función de sus
características. Los idiomas se pueden clasificar en múltiples paradigmas.
"""
class ParadigmaDeProgramacionImperativa(ParadigmaDeProgramacion):
"""
En el que el programador instruye a la máquina cómo cambiar su estado.
"""
class ProgramacionOrientadaAObjetos(ParadigmaDeProgramacionImperativa):
"""
La Programación Orientada a Objetos es un paradigma de programación que
parte del concepto de 'objetos' como base, los cuales contienen información
en forma de campos (a veces también referidos como atributos o propiedades)
y código en forma de métodos.

Los objetos son capaces de interactuar y modificar los valores contenidos
en sus campos o atributos (estado) a través de sus métodos (comportamiento).

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.
"""
encapsulamiento = Encapsulamiento()
herencia = Herencia()
abstraccion = Abstraccion()
polimorfismo = Polimorfismo()

class ProgramacionProcedimental(ParadigmaDeProgramacionImperativa):
"""
La programación procedimental o programación por procedimientos es un
paradigma de la programación. Muchas veces es aplicable tanto en lenguajes
de programación de bajo nivel como en lenguajes de alto nivel. En el caso
de que esta técnica se aplique en lenguajes de alto nivel, recibirá el
nombre de programación funcional. Esta técnica consiste en basarse de un
número muy bajo de expresiones repetidas, englobarlas todas en un
procedimiento o función y llamarlo cada vez que tenga que ejecutarse.
"""


class ParadigmaDeProgramacionDeclarativa(ParadigmaDeProgramacion):
"""
La programación declarativa está basada en describir el problema declarando
propiedades y reglas que deben cumplirse, en lugar de instrucciones.
"""


class ProgramacionFuncional(ParadigmaDeProgramacionDeclarativa):
"""
En informática, la programación funcional es un paradigma de programación
declarativa basado en el uso de verdaderas funciones matemáticas. En este
estilo de programación las funciones son ciudadanas de primera clase,
porque sus expresiones pueden ser asignadas a variables como se haría con
cualquier otro valor; además de que pueden crearse funciones de orden
superior.
"""


class ProgramacionLogica(ParadigmaDeProgramacionDeclarativa):
"""
La programación lógica es un tipo de paradigma de programación dentro del
paradigma de programación declarativa. El resto de los subparadigmas de
programación dentro de la programación declarativa son: programación
funcional, programación con restricciones, programas DSL
(de dominio específico) e híbridos. La programación funcional se basa en el
concepto de función (que no es más que una evolución de los predicados), de
corte más matemático. La programación lógica gira en torno al concepto de
predicado, o relación entre elementos.
"""



 Lenguajes de programación


class Haskell(ProgramacionFuncional):
"""
Haskell es un lenguaje de programación estandarizado multi-propósito,
funcionalmente puro, con evaluación no estricta y memorizada, y fuerte
tipificación estática. Su nombre se debe al lógico estadounidense Haskell
Curry, debido a su aportación al cálculo lambda, el cual tiene gran
influencia en el lenguaje. En Haskell, "una función es un ciudadano de
primera clase" del lenguaje de programación. Como lenguaje de programación
funcional, el constructor de controles primario es la función. El lenguaje
tiene sus orígenes en las observaciones de Haskell Curry y sus
descendientes intelectuales.
"""
class Smalltalk(ProgramacionOrientadaAObjetos):
"""
Smalltalk es un lenguaje reflexivo de programación, orientado a objetos y
con tipado dinámico. Por sus características, Smalltalk puede ser
considerado también como un entorno de objetos, donde incluso el propio
sistema es un objeto. Metafóricamente, se puede considerar que un Smalltalk
es un mundo virtual donde viven objetos que se comunican entre sí, mediante
el envío de mensajes.
"""

class JavaScript(ProgramacionOrientadaAObjetos, ProgramacionFuncional):
"""
JavaScript (abreviado comúnmente JS) es un lenguaje de programación
interpretado, dialecto del estándar ECMAScript. Se define como orientado a
objetos, basado en prototipos, imperativo, débilmente tipado y dinámico.
"""
class Python(ProgramacionOrientadaAObjetos, ProgramacionFuncional):
"""
Python es un lenguaje de programación interpretado cuya filosofía hace
hincapié en la legibilidad de su código. Se trata de un lenguaje de
programación multiparadigma, ya que soporta parcialmente la orientación a
objetos, programación imperativa y, en menor medida, programación funcional.
"""
extensiones = ['.py', '.pyc', '.pyd', '.pyo', '.pyw', '.pyz', '.pyi']
creado_por = 'Guido van Rossum'
cadena = str('Una cadena') or 'Otra cadena'
lista = list() or []
tupla = tuple() or ()
conjunto = set() or {()}
diccionario = dict() or {}
numero_entero = int() or 0
numero_decimal = float() or 0.0 # Ver el módulo decimal.
numero_complejo = complex() or 0j
booleano = bool() or False
valor_nulo = None

python = Python()
smalltalk = Smalltalk()
haskell = Haskell()
javascript = JavaScript()

if isinstance(python, ProgramacionFuncional):
print('Python es un lenguaje funcional.')
if isinstance(python, ProgramacionOrientadaAObjetos):
print('Python es un lenguaje orientado a objetos.')
if isinstance(python, (ProgramacionFuncional, ProgramacionOrientadaAObjetos)):
print('Python es un lenguaje multiparadigma.')
if not isinstance(smalltalk, ProgramacionFuncional):
print('Smalltalk no es un lenguaje funcional.')
if not isinstance(haskell, ProgramacionOrientadaAObjetos):
print('Haskell no es un lenguaje orientado a objetos.')

if hasattr(python, 'herencia'):
print('Python maneja herencias.')

if hasattr(python, 'encapsulacion'):
print('Python maneja encapsulación.')
if hasattr(python, 'polimorfismo'):
print('Python maneja polimorfismo.')
if hasattr(python, 'abstraccion'):
print('Python maneja abstraccion.')

if hasattr(haskell, 'herencia'):
print('Haskell no maneja herencias.')




Enlaces externos:


No hay comentarios.:

Publicar un comentario