Método __init__ Python con valores por defecto

Método __init__ Python con valores por defecto

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.

  1. ¿Ves algo incorrecto? Si es así, corrígelo.
def __init__(self, nombre:"vacío", apellidos:"vacío", edad:"N/A"):
  1. 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.

  1. 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.
  2. 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.

2 comentarios en «0»

  1. 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()

  2. 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()

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

curso Java Entrada anterior El condicional switch de Java
curso Java Entrada siguiente El bucle while de Java