Método __init__ Python con valores por defecto – 100 días de Python #23
En esta ocasión, vamos a ver como crear métodos __init__ en las clases de Python, con valores por defecto.
Llegamos a una parte del curso de Python que seguro que muchos esperabais. Se trata de una serie de nuevos capítulos sobre la programación orientada a objetos. La primera parte la tienes aquí, por si no la has visto o necesitas repasarla.
Creando una clase de Python
Voy a empezar creando la clase que vamos a ir utilizando en este capítulo. Empecemos con un simple __init__ con tres parámetros. Este le da un valor inicial a los objetos con tres atributos de instancia.
class Usuario: def __init__(self, nombre, apellidos, edad): self.nombre = nombre self.apellidos = apellidos self.edad = edad def describe(self): print(f"Nombre: {self.nombre}.") print(f"Apellidos: {self.apellidos}.") print(f"Edad: {self.edad}.") usuario1 = Usuario("Paula", "Cabello Prados", "30") usuario1.describe()
Resultado en la consola
Nombre: Paula.
Apellidos: Cabello Prados.
Edad: 30.
Constructor __init__ de Python con valores por defecto
La clase anterior es capaz de instanciar objetos con valores iniciales mediante el constructor __init__, sin embargo, estos valores, se los vamos a dar en el momento de la instanciación. Debes saber, que podemos dar un valor __init__ por defecto, para que todos los objetos vengan con dichos valores, a no ser que se indique lo contrario.
Fíjate en la línea 2. Estoy usando argumentos de clave como parámetros.
class Usuario: def __init__(self, nombre="usuario", apellidos="apellido por defecto", edad ="0"): self.nombre = nombre self.apellidos = apellidos self.edad = edad def describe(self): print(f"Nombre: {self.nombre}.") print(f"Apellidos: {self.apellidos}.") print(f"Edad: {self.edad}.")
En los siguientes objetos, podrás apreciar la utilidad de emplear este sistema.
Instancio un objeto sin poner argumentos. Cosa que antes me daría error, al no pasarle los argumentos posicionales requeridos. Puesto que se los estoy pasando ya en el __init__, no hay problema.
usuario1 = Usuario() usuario1.describe()
El resultado en la consola, es que se crea un objeto con todos esos valores iniciales por defecto.
Resultado en la consola
Nombre: usuario.
Apellidos: apellido por defecto.
Edad: 0.
Si quiero, puede indicar de manera posicional uno de los parámetros, por ejemplo, solo el nombre.
usuario2 = Usuario("Miriam") usuario2.describe()
En esta situación, queda el nombre cambiado con el valor de instancia, pero el resto sigue con los que tiene el __init__ por defecto.
Resultado en la consola
Nombre Miriam.
Apellidos apellido por defecto.
Edad 0.
En otro objeto, le indico de manera posicional, todos los argumentos.
usuario3 = Usuario("Michael", "Navas Expósito", "49") usuario3.describe()
Esta vez, se reemplazan todos los valores por defecto.
Resultado en la consola
Nombre Michael.
Apellidos Navas Expósito.
Edad 49.
Otra cosa que puedo hacer, es especificar argumentos de clave en el orden que quiera. No necesariamente tengo que pasarle los tres que tiene el __init__. Los que no especifique, quedarán por defecto. Recuerda, que al ser argumentos de clave, el orden posicional no importa.
usuario4 = Usuario(edad="27", apellidos="Morán Serra") usuario4.describe()
Método __init__ con parámetros por defecto y posicionales
Otra cosa que también se puede hacer, es utilizar parámetros posicionales obligatorios sin un valor inicial y los que tienen valores por defecto.
Aquí va un ejemplo:
class Usuario: def __init__(self, telefono, nombre="usuario", apellidos="apellidos por defecto", edad="0"): self.nombre = nombre self.apellidos = apellidos self.edad = edad self.telefono = telefono def describe(self): print(f"Nombre: {self.nombre}.") print(f"Apellidos: {self.apellidos}.") print(f"Edad: {self.edad}.") print(f"Teléfono: {self.telefono}.") usuario1 = Usuario("67584939005", edad="27", apellidos="Morán Serra") usuario1.describe()
Resultado en la consola
Nombre: usuario.
Apellidos: Morán Serra.
Edad: 27.
Telefono: 67584939005.
Los valores por defecto, te dejan la libertad de especificarlos en la instanciación o no. En este ejemplo, hay que indicar siempre el argumento posicional correspondiente al parámetro «telefono». El resto, son opcionales.
También debes tener en cuenta, que no puedes asignar parámetros posicionales después de los por defecto. Esto produciría error:
def __init__(self, nombre="usuario", apellidos="apellidos por defecto", edad="0", telefono):
Error en la consola
SyntaxError: non-default argument follows default argument
Error de sintaxis: un parámetro sin valores por defecto (parámetro ‘telefono’), no puede declararse después de uno (o varios) parámetros con valores por defecto.
No te pierdas nada de todo el contenido que tengo sobre Python.
Ejercicios de Python con programación orientada a objetos
En esta sección, tienes unos ejercicios relacionados con el temario. Las soluciones estarán disponibles en el siguiente capítulo.
- ¿Ves algo incorrecto? Si es así, corrígelo.
def __init__(self, nombre:"vacío", apellidos:"vacío", edad:"N/A"):
- Crea una clase llamada «Vehiculo». Esta deberá tener los siguientes valores por defecto en el __init__:
- ruedas: 4.
- puertas: 5.
- color: «negro».
- asientos: 5.
Además, quiero que crees un método que sea capaz de mostrar esa información. Si le quieres añadir algo más a esta clase, eres libre de hacerlo.
- Haz una instancia con todos los valores por defecto que tiene la clase «Vehiculo». Llama al método que muestra toda la información del objeto.
- Haz otra instancia. Esta vez, el vehículo es de color rojo y solo tiene 3 puertas y 4 asientos. Llama al método que muestra toda la información del objeto.
Asi me salio sin ver, gracias por todo!
class Vehiculo:
def __init__(self, ruedas=»4″, puertas=»5″, color=»negro», asientos=»5″):
self.ruedas=ruedas
self.puertas=puertas
self.color=color
self.asientos=asientos
def mostrarInfo(self):
print(f»Las Ruedas son: {self.ruedas}.»)
print(f»Las Puertas sons: {self.puertas}.»)
print(f»El Color es: {self.color}.»)
print(f»Los Asientos son: {self.asientos}.»)
Carro = Vehiculo()
Carro2 = Vehiculo(color=»rojo», puertas=»3″, asientos=»4″)
Carro.mostrarInfo()
Carro2.mostrarInfo()
Así lo hice:
class vehiculo:
def __init__(self,ruedas=»4″,puertas=»5″,color=»negro»,asientos=»5″):
self.ruedas = ruedas
self.puertas = puertas
self.color = color
self.asientos = asientos
def mostrar_info(self):
print(f»El Vehículo color {self.color} tiene {self.ruedas} ruedas, {self.asientos} asientos y {self.puertas} puertas.»)
vehiculo1 = vehiculo()
vehiculo2 = vehiculo(color=»rojo»,asientos=»4″,puertas=»3″)
vehiculo1.mostrar_info()
vehiculo2.mostrar_info()