Índice del Contenido[Esconder][Espectáculo]
En esta lección, aprenderemos sobre clases, constructores y herencia en python.
Estos conceptos son realmente importantes en un programa grande donde se necesitan definir diferentes tipos.
Clases
Las clases son esenciales en la programación y no son específicas de Python. Muchos otros lenguajes de programación apoyar la noción de clases. Usamos clases para definir nuevos tipos de datos.
Hasta ahora, hemos aprendido sobre los tipos de datos básicos en Python, como números, cadenas y booleanos. Estos son los tipos de datos básicos o simples en Python. También hemos visto un par de tipos de datos complejos como listas y diccionarios.
Si bien estos tipos son extremadamente útiles, no siempre se pueden usar para modelar conceptos complejos. Por ejemplo, piense en la idea de un punto o un carrito de compras. Un carrito de compras no es un booleano o una lista. Es un tipo diferente de datos. Entonces podemos usar clases para definir nuevos tipos para modelar conceptos reales.
Ahora, definamos un nuevo tipo de datos llamado punto. Este nuevo tipo va a tener métodos como lo comprobamos antes.
Así es como lo harás:
Comenzamos definiendo una clase usando la palabra clave "clase" y justo después de eso le damos un nombre a nuestra clase.
class Point
Ahora, mire la convención de nomenclatura que he usado aquí. He escrito en mayúscula la primera letra aquí, esto es lo que llamamos una convención de nomenclatura pascal. Esta convención es diferente de la que usamos para nombrar nuestras variables y funciones, para las cuales siempre usamos letras minúsculas y separamos varias palabras usando un guión bajo. Pero cuando nombramos clases, no usamos un guión bajo para separar varias palabras, sino que ponemos en mayúscula la primera letra de cada palabra.
Después de definir nuestra clase, se usan dos puntos, lo que significa que ahora se define un bloque.
class Point:
def move (self):
En este bloque podemos definir todas las funciones o métodos que pertenecen a los puntos. Por ejemplo, podemos definir una función llamada "mover" para mover un punto. Tenga en cuenta que tan pronto como escribamos paréntesis abiertos, PyCharm agrega automáticamente "self" aquí. Esta es una palabra clave especial y déjame volver a esto en breve. Imprimamos "mover" en la terminal.
print("move")
Definamos otro método como "dibujar" e imprimámoslo en la terminal.
def draw(self):
print("draw")
Hemos terminado con la definición de nuestra clase "punto". Con este nuevo tipo, podemos crear nuevos objetos. Una clase simplemente define el modelo o la plantilla para crear objetos que son las instancias reales basadas en ese modelo. Para crear un objeto, escribimos el nombre de nuestra clase y luego lo llamamos como una función. Esto crea un nuevo objeto y luego lo devuelve. Entonces podemos almacenar ese objeto en una variable. Deja que te enseñe:
Aquí hemos definido un “punto1” que es un punto tridimensional. Puede ver que podemos imprimir coordenadas individuales en la terminal.
Podemos usar los dos métodos "dibujar" y "mover" con este punto.
Entonces, para recapitular, usamos clases para definir nuevos tipos y estos tipos pueden tener métodos que definimos en el cuerpo de la clase. Las clases pueden tener atributos que podemos establecer en cualquier parte de nuestros programas.
Constructores
Hasta ahora, hemos aprendido cómo crear nuevos tipos usando clases. Ahora hay un pequeño problema con esta implementación. Podemos crear un objeto de punto sin una coordenada x o y usando clases y eso no es lo ideal. Deja que te enseñe.
Vamos a crear un punto e imprimirlo antes de establecer la coordenada x. Ejecutar nuestro programa da como resultado un error de atributo como este:
Significa que el objeto de punto no tiene un atributo llamado x. Ahora el problema es que es posible tener un objeto puntual sin coordenadas x o y. Esto no tiene sentido ya que cada vez que hablamos de un punto, necesitamos saber dónde se encuentra ese punto. Para resolver este problema, usamos un constructor. Un constructor es una función que se llama en el momento de crear un objeto.
Así es como usamos un constructor. Primero, pasemos los valores de las coordenadas x e y en el programa anterior.
point = Point(10, 20)
print(point.x)
Ahora, necesitamos agregar un método especial en esta clase llamado constructor. Su sintaxis es así:
def __init__(self, x, y):
init
es la abreviatura de initialized, y esta es la función o el método que se llama cuando se crea un nuevo objeto de punto. La x y la y se suman justo después self
para agregar dos parámetros adicionales.
Después de eso, debemos asignar x e y a los valores pasados, es decir, 10 y 20.
self.x = x
self.y = y
Usamos la self
para referirnos al objeto actual y luego establecemos el atributo x al argumento x pasado a la función "x". De esta manera, usando init
método, podemos inicializar nuestros objetos. Este método se conoce como constructor. Ejecutemos nuestro programa.
Ahora, podemos cambiar las coordenadas x e y más tarde. Actualicemos la coordenada x:
point = Point(10, 20)
point.x = 11
print(point.x)
Ahora, la coordenada x se actualiza al valor 11.
Ejercicio
Aquí hay un ejercicio interesante para ti.
Quiero que definas un nuevo tipo llamado persona. Estos objetos "Persona" deben tener un "name
” atributo así como un “talk()
"Método.
Es una tarea sencilla y no debería tomar más de un par de minutos.
Solución
Comience definiendo la clase "Persona" de esta manera:
class Person:
self.name = name
Definiremos el constructor más adelante. Ahora, podemos crear el objeto "Persona". Llamémoslo Juan
john = Person("John Smith")
print(john.name)
john.talk()
Ahora, vaya a la primera parte del código y cree un constructor.
def __init__(self, name):
El código final se verá así:
También puede usar cadenas formateadas y otros conceptos junto con clases y constructores.
Herencia
La herencia es otro concepto asociado con las clases que le permiten reutilizar un código.
Considere esta pieza de código.
class Dog:
def walk(self):
print("walk")
Hemos creado una clase "Perro" con un método de "paseo". En este método, simplemente estamos imprimiendo el mensaje de caminata en la terminal. Digamos, en un programa real, aquí hay 10 líneas de código en lugar de una sola línea. En el futuro, si se necesita otra clase para tener el método "caminar", tendremos que repetir todo ese código. Esto no es ideal.
En programación, tenemos un principio llamado SECO, que es la abreviatura de no te repitas. Digamos que en algún momento en el futuro, descubrimos un problema con nuestro método de "caminar" y si hemos repetido o duplicado este método en muchos otros lugares, tendremos que regresar y solucionar ese problema en cada lugar donde hemos duplicado este código. Por eso es que en programación no debemos definir algo dos veces.
Existen diferentes enfoques para remediar este problema, pero aquí vamos a aprender el que es más fácil para los principiantes y se llama herencia. En este caso, crearemos otra clase "mamífero" y definiremos nuestro atributo "caminar" en esa clase.
class Mammal:
def walk(self):
print("walk")
Después de definir nuestra clase "Mamíferos", podemos usar la herencia para pasar atributos como este:
Tanto la clase de perro como la de gato heredan todos los métodos de clase definidos en su clase principal. Ahora, podemos agregar métodos específicos para perros como este:
class Dog:
def bark(self):
print("bark")
¡Envolver!
Esto fue todo acerca de las clases, los constructores y la reutilización del código en clases con conceptos de herencia. Ahora nos estamos acercando al final de nuestra serie. En este punto, debería poder producir códigos buenos, legibles y concisos en Python.
Veremos el concepto de módulos y paquetes en la próxima lección.
Deje un comentario