Menú Módulo 5 y 6
Menú Módulo 5 y 6
List of contents
Module 5 Now
o Back
o Module 5
o 5.1.1 Fundamentos de Python: Parte 2 Now
Back
5.1.1 Fundamentos de Python: Parte 2
5.1.1.1 Fundamentos de Python: Parte 2 Now
5.1.1.2 Fundamentos de Python: Módulo 5
5.1.1.3 Módulos
5.1.1.4 Empleando Módulos
5.1.1.5 Empleando Módulos
5.1.1.6 Empleando Módulos
5.1.1.7 Importando un Módulo | math
5.1.1.8 Importando un Módulo | math
5.1.1.9 Importando un Módulo | math
5.1.1.10 Importando un Módulo | math
5.1.1.11 Importando un Módulo | * y as
5.1.1.12 Importando un Módulo | aliasing
5.1.2.1 Módulos Útiles
5.1.2.2 Módulos Útiles | math
5.1.2.3 Módulos Útiles | math
5.1.2.4 Módulos Útiles | math
5.1.2.5 Módulos útiles | aleatorio
5.1.2.6 Módulos Útiles | random
5.1.2.7 Módulos Útiles | random
5.1.2.8 Módulos Útiles | random
5.1.2.9 Módulos Útiles | random
5.1.2.10 Módulos Útiles | platform
5.1.2.11 Módulos Útiles | platform
5.1.2.12 Módulos Útiles | platform
5.1.2.13 Módulos Útiles | platform
5.1.2.14 Módulos Útiles | platform
5.1.2.15 Módulos Útiles | platform
5.1.2.16 Módulos Útiles
5.1.3.1 Módulos y Paquetes
5.1.3.2 Módulos y Paquetes
5.1.3.3 Módulos y Paquetes
5.1.3.4 Módulos y Paquetes
5.1.3.5 Módulos y Paquetes
5.1.3.6 Módulos y Paquetes
5.1.3.7 Módulos y Paquetes
5.1.3.8 Módulos y Paquetes
5.1.3.9 Módulos y Paquetes
5.1.3.10 Módulos y Paquetes
5.1.4.1 Errores: el pan diario del programador
5.1.4.2 Errores: el pan diario del programador
5.1.4.3 Errores: el pan diario del programador
5.1.4.4 Errores: el pan diario del programador
5.1.4.5 Errores: el pan diario del programador
5.1.4.6 Errores: el pan diario del programador | try-except
5.1.4.7 Errores: el pan diario del programador | try-except
5.1.4.8 Errores: el pan diario del programador | try-except
5.1.4.9 Errores: el pan diario del programador | try-except
5.1.4.10 Errores: el pan diario del programador | try-except
5.1.4.11 Errores: el pan diario del programador | try-except
5.1.5.1 La anatomía de las excepciones
5.1.5.2 La anatomía de las excepciones
5.1.5.3 La anatomía de las excepciones
5.1.5.4 La anatomía de las excepciones
5.1.5.5 La anatomía de las excepciones | raise
5.1.5.6 La anatomía de las excepciones | raise
5.1.5.7 La anatomía de las excepciones | assert
5.1.6.1 Excepciones útiles
5.1.6.2 Excepciones útiles
5.1.6.3 Excepciones útiles
5.1.6.4 Leer ints de forma segura Lab
5.1.7.1 Caracteres y Cadenas
5.1.7.2 Caracteres y Cadenas
5.1.7.3 Caracteres y Cadenas
5.1.8.1 La naturaleza de las cadenas en Python
5.1.8.2 La naturaleza de las cadenas en Python
5.1.8.3 La naturaleza de las cadenas en Python
5.1.8.4 La naturaleza de las cadenas en Python
5.1.8.5 La naturaleza de las cadenas en Python
5.1.8.6 La naturaleza de las cadenas en Python
5.1.8.7 La naturaleza de las cadenas en Python
5.1.8.8 La naturaleza de las cadenas en Python
5.1.8.9 La naturaleza de las cadenas en Python
5.1.8.10 La naturaleza de las cadenas en Python
5.1.8.11 La naturaleza de las cadenas en Python
5.1.8.12 La naturaleza de las cadenas en Python
5.1.8.13 La naturaleza de las cadenas en Python
5.1.8.14 La naturaleza de las cadenas en Python
5.1.9.1 Métodos de cadenas
5.1.9.2 Métodos de cadenas
5.1.9.3 Métodos de cadenas
5.1.9.4 Métodos de cadenas
5.1.9.5 Métodos de cadenas
5.1.9.6 Métodos de cadenas
5.1.9.7 Métodos de cadenas
5.1.9.8 Métodos de cadenas
5.1.9.9 Métodos de cadenas
5.1.9.10 Métodos de cadenas
5.1.9.11 Métodos de cadenas
5.1.9.12 Métodos de cadenas
5.1.9.13 Métodos de cadenas
5.1.9.14 Métodos de cadenas
5.1.9.15 Métodos de cadenas
5.1.9.16 Métodos de cadenas
5.1.9.18 Tu propio split Lab
5.1.10.1 Cadenas en acción
5.1.10.2 Cadenas en acción
5.1.10.3 Cadenas en acción
5.1.10.4 Cadenas en acción
5.1.10.6 LABORATORIO: Un Display LED Lab
5.1.11.1 Cuatro simples programas
5.1.11.2 Cuatro simples programas
5.1.11.3 Cuatro simples programas
5.1.11.4 Cuatro simples programas
5.1.11.6 LABORATORIO: Mejorando el cifrado César Lab
5.1.11.7 LABORATORIO: Palíndromos Lab
5.1.11.8 LABORATORIO: Anagramas Lab
5.1.11.9 LABORATORIO: El Dígito de la Vida Lab
5.1.11.10 LABORATIORIO: ¡Encuentra una palabra! Lab
5.1.11.11 LABORATORIO: Sudoku Lab
o 5.2.1 Module 5 Quiz Quiz
Back
5.2.1 Module 5 Quiz
5.2.1.1 Module 5 Quiz Quiz
o 5.3.1 Module 5 Test Quiz
Back
5.3.1 Module 5 Test
5.3.1.1 Module 5 Test Quiz
Module 6
o Back
o Module 6
o 6.1.1 Fundamentos de Python: Módulo 6
Back
6.1.1 Fundamentos de Python: Módulo 6
6.1.1.1 Fundamentos de Python: Módulo 6
6.1.1.2 Los fundamentos de la POO
6.1.1.3 Los fundamentos de la POO
6.1.1.4 Los fundamentos de la POO
6.1.1.5 Los fundamentos de la POO
6.1.1.6 Los fundamentos de la POO
6.1.1.7 Los fundamentos de la POO
6.1.1.8 Los fundamentos de la POO
6.1.2.1 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.2 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.3 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.4 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.5 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.6 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.7 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.8 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.9 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.10 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.11 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.2.12 Un corto viaje desde el enfoque procedimental hasta el
orientado a objetos
6.1.3.1 Propiedades de la POO
6.1.3.2 Propiedades de la POO
6.1.3.3 Propiedades de la POO
6.1.3.4 Propiedades de la POO
6.1.3.5 Propiedades de la POO
6.1.3.6 Propiedades de la POO
6.1.3.7 Propiedades de la POO
6.1.3.8 Propiedades de la POO
6.1.4.1 POO: Métodos
6.1.4.2 POO: Métodos
6.1.4.3 POO: Métodos
6.1.4.4 POO: Métodos
6.1.4.5 POO: Métodos
6.1.4.6 POO: Métodos
6.1.4.7 POO: Métodos
6.1.4.8 POO: Métodos
6.1.4.9 POO: Métodos
6.1.4.10 POO: Métodos
6.1.5.1 Fundamentos de POO: Herencia
6.1.5.2 Fundamentos de POO: Herencia
6.1.5.3 Fundamentos de POO: Herencia
6.1.5.4 Fundamentos de POO: Herencia
6.1.5.5 Fundamentos de POO: Herencia
6.1.5.6 Fundamentos de POO: Herencia
6.1.5.7 Fundamentos de POO: Herencia
6.1.5.8 Fundamentos de POO: Herencia
6.1.5.9 Fundamentos de POO: Herencia
6.1.5.10 Fundamentos de POO: Herencia
6.1.5.11 Fundamentos de POO: Herencia
6.1.5.12 Fundamentos de POO: Herencia
6.1.5.13 Fundamentos de POO: Herencia
6.1.5.14 Fundamentos de POO: Herencia
6.1.5.15 Fundamentos de POO: Herencia
6.1.5.16 Fundamentos de POO: Herencia
6.1.5.17 Fundamentos de POO: Herencia
6.1.5.18 Fundamentos de POO: Herencia
6.1.5.19 Fundamentos de POO: Herencia
6.1.6.1 Excepciones una vez más
6.1.6.2 Excepciones una vez más
6.1.6.3 Excepciones una vez más
6.1.6.4 Excepciones una vez más
6.1.6.5 Excepciones una vez más
6.1.6.6 Excepciones una vez más
6.1.6.7 Excepciones una vez más
6.1.6.8 Excepciones una vez más
6.1.7.1 Generadores y cierres
6.1.7.2 Generadores y cierres
6.1.7.3 Generadores y cierres
6.1.7.4 Generadores y cierres
6.1.7.5 Generadores y cierres
6.1.7.6 Generadores y cierres
6.1.7.7 Generadores y cierres
6.1.7.8 Generadores y cierres
6.1.7.9 Generadores y cierres
6.1.7.10 Generadores y cierres
6.1.7.11 Generadores y cierres
6.1.7.12 Generadores y cierres
6.1.7.13 Generadores y cierres
6.1.7.14 Generadores y cierres
6.1.8.1 Procesando archivos
6.1.8.2 Procesando archivos
6.1.8.3 Procesando archivos
6.1.8.4 Procesando archivos
6.1.8.5 Procesando archivos
6.1.8.6 Procesando archivos
6.1.8.7 Procesando archivos
6.1.8.8 Procesando archivos
6.1.8.9 Procesando archivos
6.1.8.10 Procesando archivos
6.1.8.11 Procesando archivos
6.1.9.1 Trabajando con archivos reales
6.1.9.2 Trabajando con archivos reales
6.1.9.3 Trabajando con archivos reales
6.1.9.4 Trabajando con archivos reales
6.1.9.5 Trabajando con archivos reales
6.1.9.6 Trabajando con archivos reales
6.1.9.7 Trabajando con archivos reales
6.1.9.8 Trabajando con archivos reales
6.1.9.9 Trabajando con archivos reales
6.1.9.10 Trabajando con archivos reales
6.1.9.11 Trabajando con archivos reales
6.1.9.12 Trabajando con archivos reales
6.1.9.13 Trabajando con archivos reales
6.1.9.14 Trabajando con archivos reales
6.1.9.15 LABORATORIO: Histograma de frecuencia de caracteres
Lab
6.1.9.16 LABORATORIO: Histograma de frecuencia de caracteres
ordenado Lab
6.1.9.17 LABORATORIO: Evaluando los resultados de los
estudiantes Lab
o 6.2.1 Module 6 Quiz Quiz
Back
6.2.1 Module 6 Quiz
6.2.1.1 Module 6 Quiz Quiz
o 6.3.1 Module 6 Test Quiz
Back
6.3.1 Module 6 Test
6.3.1.1 Module 6 Test Quiz
o 6.6.1 Fundamentos de Programación en Python - PCAP
Back
6.6.1 Fundamentos de Programación en Python - PCAP
6.6.1.1 Fundamentos de Programación en Python - PCAP
Sandbox
Fundamentos de Programación en Python:
Módulo 6
Casi todos los programas y técnicas que has utilizado hasta ahora pertenecen al estilo de
programación procedimental. Es cierto que has utilizado algunos objetos incorporados, pero
cuando nos referimos a ellos, se mencionan lo mínimo posible.
El enfoque orientado a objetos es bastante joven (mucho más joven que el enfoque
procedimental) y es particularmente útil cuando se aplica a proyectos grandes y complejos
llevados a cabo por grandes equipos formados por muchos desarrolladores.
Este tipo de programación en un proyecto facilita muchas tareas importantes, por ejemplo,
dividir el proyecto en partes pequeñas e independientes y el desarrollo independiente de
diferentes elementos del proyecto.
Además, puedes crear muchas aplicaciones útiles, incluso si no se sabe nada sobre clases y
objetos, pero debes tener en cuenta que algunos de los problemas (por ejemplo, el manejo
de la interfaz gráfica de usuario) puede requerir un enfoque estricto de objetos.
Las funciones pueden usar datos, pero no al revés. Además, las funciones pueden abusar de
los datos, es decir, usar el valor de manera no autorizada (por ejemplo, cuando la función
seno recibe el saldo de una cuenta bancaria como parámetro).
Los datos no pueden usar funciones. ¿Pero es esto completamente cierto? ¿Hay algunos
tipos especiales de datos que pueden usar funciones?
Sí, los hay, los llamados métodos. Estas son funciones que se invocan desde dentro de los
datos, no junto con ellos. Si puedes ver esta distinción, has dado el primer paso en la
programación de objetos.
El enfoque orientado a objetos sugiere una forma de pensar completamente diferente. Los
datos y el código están encapsulados juntos en el mismo mundo, divididos en clases.
Cada clase es como una receta que se puede usar cuando quieres crear un objeto útil.
Puedes producir tantos objetos como necesites para resolver tu problema.
Cada objeto tiene un conjunto de rasgos (se denominan propiedades o atributos; usaremos
ambas palabras como sinónimos) y es capaz de realizar un conjunto de actividades (que se
denominan métodos).
Las recetas pueden modificarse si son inadecuadas para fines específicos y, en efecto,
pueden crearse nuevas clases. Estas nuevas clases heredan propiedades y métodos de los
originales, y generalmente agregan algunos nuevos, creando nuevas herramientas más
específicas.
Los objetos son encarnaciones de las ideas expresadas en clases, como un pastel de queso
en tu plato, es una encarnación de la idea expresada en una receta impresa en un viejo libro
de cocina.
Los objetos interactúan entre sí, intercambian datos o activan sus métodos. Una clase
construida adecuadamente (y, por lo tanto, sus objetos) puede proteger los datos sensibles y
ocultarlos de modificaciones no autorizadas.
No existe un límite claro entre los datos y el código: viven como uno solo dentro de los
objetos.
Todos estos conceptos no son tan abstractos como pudieras pensar al principio. Por el
contrario, todos están tomados de experiencias de la vida real y, por lo tanto, son
extremadamente útiles en la programación de computadoras: no crean vida artificial
reflejan hechos reales, relaciones y circunstancias.
Jerarquías de clase
La palabra clases tiene muchos significados, pero no todos son compatibles con las ideas
que queremos discutir aquí. La clase que nos concierne es como una categoría, como
resultado de similitudes definidas con precisión.
Intentaremos señalar algunas clases que son buenos ejemplos de este concepto.
Veamos por un momento los vehículos. Todos los vehículos existentes (y los que aún no
existen) estan relacionados por una sola característica importante: la capacidad de
moverse. Puedes argumentar que un perro también se mueve; ¿Es un perro un vehículo? No
lo es. Tenemos que mejorar la definición, es decir, enriquecerla con otros criterios,
distinguir los vehículos de otros seres y crear una conexión más fuerte. Consideremos las
siguientes circunstancias: los vehículos son entidades creadas artificialmente que se utilizan
para el transporte, movidos por fuerzas de la naturaleza y dirigidos (conducidos) por
humanos.
La clase vehículos es muy amplia. Tenemos que definir clases especializadas. Las clases
especializadas son las subclases. La clase vehículos será una superclase para todas ellas.
Nota: la jerarquía crece de arriba hacia abajo, como raíces de árboles, no ramas. La
clase más general y más amplia siempre está en la parte superior (la superclase) mientras
que sus descendientes se encuentran abajo (las subclases).
Vehículos Terrestres.
Vehículos Acuáticos.
Vehículos Aéreos.
Vehículos Espaciales.
Los vehículos terrestres pueden dividirse aún más, según el método con el que impactan el
suelo. Entonces, podemos enumerar:
Vehículos de ruedas.
Vehículos oruga.
Aerodeslizadores.
Ten en cuenta la dirección de las flechas: siempre apuntan a la superclase. La clase de nivel
superior es una excepción: no tiene su propia superclase.
Podemos decir que todos los animales (nuestra clase de nivel superior) se puede dividir en
cinco subclases:
Mamíferos.
Reptiles.
Pájaros.
Peces.
Anfibios.
Mamíferos salvajes.
Mamíferos domesticados.
Intenta extender la jerarquía de la forma que quieras y encuentra el lugar adecuado para los
humanos.
¿Qué es un objeto?
Una clase (entre otras definiciones) es un conjunto de objetos. Un objeto es un ser
perteneciente a una clase.
Por ejemplo: cualquier automóvil personal es un objeto que pertenece a la clase vehículos
terrestres. También significa que el mismo automóvil pertenece a todas las
superclases de su clase local; por lo tanto, también es miembro de la clase vehículos.
Tu perro (o tu gato) es un objeto incluido en la clase Mamíferos domesticados, lo
que significa explícitamente que también está incluido en la clase animales.
Cada subclase es más especializada (o más específica) que su superclase. Por el contrario,
cada superclase es más general (más abstracta) que cualquiera de sus subclases. Ten en
cuenta que hemos supuesto que una clase solo puede tener una superclase; esto no siempre
es cierto, pero discutiremos este tema más adelante.
Herencia
La clase de inicio del objeto puede definir nuevos rasgos (así como requisitos y cualidades)
que serán heredados por cualquiera de sus superclases.
No deberías tener ningún problema para hacer coincidir esta regla con ejemplos
específicos, ya sea que se aplique a animales o vehículos.
¿Qué contiene un objeto?
La programación orientada a objetos supone que cada objeto existente puede estar
equipado con tres grupos de atributos:
Hay una pista (aunque esto no siempre funciona) que te puede ayudar a identificar
cualquiera de las tres esferas anteriores. Cada vez que se describe un objeto y se usa:
Tu primera clase
La programación orientada a objetos es el arte de definir y expandir clases. Una clase es
un modelo de una parte muy específica de la realidad, que refleja las propiedades y
actividades que se encuentran en el mundo real.
Las clases definidas al principio son demasiado generales e imprecisas para cubrir el mayor
número posible de casos reales.
No hay obstáculo para definir nuevas subclases más precisas. Heredarán todo de su
superclase, por lo que el trabajo que se utilizó para su creación no se desperdicia.
La nueva clase puede agregar nuevas propiedades y nuevas actividades y, por lo tanto,
puede ser más útil en aplicaciones específicas. Obviamente, se puede usar como una
superclase para cualquier número de subclases recién creadas.
El proceso no necesita tener un final. Puedes crear tantas clases como necesites.
La clase que se define no tiene nada que ver con el objeto: la existencia de una clase no
significa que ninguno de los objetos compatibles se creará automáticamente. La clase
en sí misma no puede crear un objeto: debes crearlo tu mismo y Python te permite hacerlo.
Es hora de definir la clase más simple y crear un objeto. Echa un vistazo al siguiente
ejemplo:
class ClaseSimple:
pass
A continuación, se agregan dos puntos:), como clases, como funciones, forman su propio
bloque anidado. El contenido dentro del bloque define todas las propiedades y actividades
de la clase.
La palabra clave reservada pass llena la clase con nada. No contiene ningún método ni
propiedades.
Tu primer objeto
La clase recién definida se convierte en una herramienta que puede crear nuevos objetos.
La herramienta debe usarse explícitamente, bajo demanda.
Para hacer esto, debes asignar una variable para almacenar el objeto recién creado de esa
clase y crear un objeto al mismo tiempo.
miPrimerObjeto = ClaseSimple()
Nota:
El nombre de la clase intenta fingir que es una función, ¿puedes ver esto? Lo discutiremos
pronto.
El objeto recién creado está equipado con todo lo que trae la clase; Como esta clase está
completamente vacía, el objeto también está vacío.
El nombre alternativo para una pila (pero solo en la terminología de TI) es UEPS (LIFO
son sus siglas en íngles). Es una abreviatura para una descripción muy clara del
comportamiento de la pila: Último en Entrar - Primero en Salir (Last In - First Out). La
moneda que quedó en último lugar en la pila saldrá primero.
Las pilas se usan muy a menudo en muchos algoritmos clásicos, y es difícil imaginar la
implementación de muchas herramientas ampliamente utilizadas sin el uso de pilas.
Implementemos una pila en Python. Esta será una pila muy simple, y te mostraremos cómo
hacerlo en dos enfoques independientes: de manera procedimental y orientado a objetos.
Comencemos con el primero.
pila = []
Estamos listos para definir una función que pone un valor en la pila. Aquí están las
presuposiciones para ello:
Ahora es tiempo de que una función quite un valor de la pila. Así es como puedes
hacerlo:
Armemos todas las piezas juntas para poner la pila en movimiento. El programa completo
empuja (push) tres números a la pila, los saca e imprime sus valores en pantalla. Puedes
verlo en la ventana del editor.
1 2 3
Pruébalo.
pila = []
def push(val):
pila.append(val)
def pop():
val = pila[-1]
del pila[-1]
return val
push(3)
push(2)
push(1)
print(pop())
print(pop())
print(pop())
Pero cuanto más la uses, más desventajas encontrarás. Éstas son algunas de ellas:
También puede suceder que un día necesites más de una pila; tendrás que crear otra
lista para el almacenamiento de la pila, y probablemente otras funciones push y
pop.
También puede suceder que no solo necesites funciones push y pop, pero también
algunas otras funciones; ciertamente podrías implementarlas, pero intenta imaginar
qué sucedería si tuvieras docenas de pilas implementadas por separado.
El enfoque orientado a objetos ofrece soluciones para cada uno de los problemas anteriores.
Vamos a nombrarlos primero:
Cuando tienes una clase que implementa todos los comportamientos de pila
necesarios, puedes producir tantas pilas como desees; no necesitas copiar ni replicar
ninguna parte del código.
class Pila:
En su lugar, debes agregar una instrucción específica. Las propiedades deben agregarse a la
clase manualmente.
¿Cómo garantizar que dicha actividad tiene lugar cada vez que se crea una nueva pila?
Hay una manera simple de hacerlo - tienes que equipar a la clase con una función
específica:
Tiene que ser nombrada de forma estricta.
Se invoca implícitamente cuando se crea el nuevo objeto.
¡Hola!
Nota: no hay rastro de la invocación del constructor dentro del código. Ha sido invocado
implícita y automáticamente. Hagamos uso de eso ahora.
print("¡Hola!")
Esto significa que puedes agregar cualquier propiedad al objeto y la propiedad permanecerá
allí hasta que el objeto termine su vida o la propiedad se elimine explícitamente.
Ahora agreguemos solo una propiedad al nuevo objeto - una lista para la pila. La
nombraremos listaPila.
Nota:
Hemos usado la notación punteada, al igual que cuando se invocan métodos. Esta
es la manera general para acceder a las propiedades de un objeto: debes nombrar el
objeto, poner un punto (.) después de el, y especificar el nombre de la propiedad
deseada, ¡no uses paréntesis! No deseas invocar un método, deseas acceder a una
propiedad.
Si estableces el valor de una propiedad por primera vez (como en el constructor), lo
estás creando; a partir de ese momento, el objeto tiene la propiedad y está listo para
usar su valor.
Hemos hecho algo más en el código: hemos intentado acceder a la propiedad
listaPila desde fuera de la clase inmediatamente después de que se haya creado el
objeto; queremos verificar la longitud actual de la pila, ¿lo hemos logrado?
Esto no es lo que queremos de la pila. Nosotros queremos que listaPila este escondida
del mundo exterior. ¿Es eso posible?
class Pila:
def __init__(self):
self.listaPila = []
objetoPila = Pila()
print(len(objetoPila.listaPila))
¿Por qué?
Cuando cualquier componente de la clase tiene un nombre que comienza con dos guiones
bajos (__), se vuelve privado - esto significa que solo se puede acceder desde la clase.
No puedes verlo desde el mundo exterior. Así es como Python implementa el concepto de
encapsulación.
class Pila:
def __init__(self):
self.listaPila = []
objetoPila = Pila()
print(len(objetoPila.__listaPila))
Tal componente es llamado publico, por ello no puede comenzar su nombre con dos (o
más) guiones bajos. Hay un requisito más - el nombre no debe tener más de un guión
bajo.
Sin embargo, hay algo realmente extraño en el código. Las funciones parecen familiares,
pero tienen más parámetros que sus contrapartes procedimentales.
Aquí, ambas funciones tienen un parámetro llamado self en la primera posición de la lista
de parámetros.
Todos los métodos deben tener este parámetro. Desempeña el mismo papel que el primer
parámetro constructor.
Esto significa que el método está obligado a tener al menos un parámetro, que Python
mismo utiliza - no tienes ninguna influencia sobre el.
Si tu método no necesita ningún parámetro, este debe especificarse de todos modos. Si está
diseñado para procesar solo un parámetro, debes especificar dos, ya que la función del
primero sigue siendo la misma.
Hay una cosa más que requiere explicación: la forma en que se invocan los métodos desde
la variable __listaPila.
class Pila:
def __init__(self):
self.__listaPila = []
self.__listaPila.append(val)
def pop(self):
val = self.__listaPila[-1]
del self.__listaPila[-1]
return val
objetoPila = Pila()
objetoPila.push(3)
objetoPila.push(2)
objetoPila.push(1)
print(objetoPila.pop())
print(objetoPila.pop())
print(objetoPila.pop())
El enfoque orientado a objetos: una pila
desde cero
Tener tal clase abre nuevas posibilidades. Por ejemplo, ahora puedes hacer que más de una
pila se comporte de la misma manera. Cada pila tendrá su propia copia de datos privados,
pero utilizará el mismo conjunto de métodos.
Analiza el código:
class Pila:
def __init__(self):
self.__listaPila = []
self.__listaPila.append(val)
def pop(self):
val = self.__listaPila[-1]
del self.__listaPila[-1]
return val
objetoPila1 = Pila()
objetoPila2 = Pila()
objetoPila1.push(3)
objetoPila2.push(objetoPila1.pop())
print(objetoPila2.pop())