44 - Método __init__ de la clase

El método __init__ es un método especial de una clase en Python. El objetivo fundamental del método __init__ es inicializar los atributos del objeto que creamos.

Básicamente el método __init__ remplaza al método inicializar que habíamos hecho en el concepto anterior.

Las ventajas de implementar el método __init__ en lugar del método inicializar son:

  1. El método __init__ es el primer método que se ejecuta cuando se crea un objeto.
  2. El método __init__ se llama automáticamente. Es decir es imposible de olvidarse de llamarlo ya que se llamará automáticamente.
  3. Quien utiliza POO en Python (Programación Orientada a Objetos) conoce el objetivo de este método.

Otras características del método __init__ son:

  • Se ejecuta inmediatamente luego de crear un objeto.
  • El método __init__ no puede retornar dato.
  • el método __init__ puede recibir parámetros que se utilizan normalmente para inicializar atributos.
  • El método __init__ es un método opcional, de todos modos es muy común declararlo.

Veamos la sintaxis del constructor:

    
def __init__([parámetros]):
        [algoritmo]

Debemos definir un método llamado __init__ (es decir utilizamos dos caracteres de subrayado, la palabra init y seguidamente otros dos caracteres de subrayado).

Problema 1:

Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo. En el método __init__ cargar los atributos por teclado y luego en otro método imprimir sus datos y por último uno que imprima un mensaje si debe pagar impuestos (si el sueldo supera a 3000)

Programa: ejercicio190.py

Ver video

class Empleado:

    def __init__(self):
        self.nombre=input("Ingrese el nombre del empleado:")
        self.sueldo=float(input("Ingrese el sueldo:"))

    def imprimir(self):
        print("Nombre:",self.nombre)
        print("Sueldo:",self.sueldo)

    def paga_impuestos(self):
        if self.sueldo>3000:
            print("Debe pagar impuestos")
        else:
            print("No paga impuestos")


# bloque principal

empleado1=Empleado()
empleado1.imprimir()
empleado1.paga_impuestos()

Definimos el método __init__ donde cargamos por teclado el nombre del empleado y su sueldo:

    def __init__(self):
        self.nombre=input("Ingrese el nombre del empleado:")
        self.sueldo=float(input("Ingrese el sueldo:"))

Este método se ejecuta inmediatamente luego que se crea un objeto de la clase Empleado:

empleado1=Empleado()

Como vemos no llamamos directamente al método __init__ sino que se llama automáticamente.

Los otros dos métodos tienen por objeto mostrar los datos del empleado y mostrar una leyenda si paga impuestos o no:

    def imprimir(self):
        print("Nombre:",self.nombre)
        print("Sueldo:",self.sueldo)

    def paga_impuestos(self):
        if self.sueldo>3000:
            print("Debe pagar impuestos")
        else:
            print("No paga impuestos")

Desde el bloque principal donde creamos un objeto de la clase Empleado debemos llamar explícitamente a estos dos métodos:

empleado1.imprimir()
empleado1.paga_impuestos()

Problema 2:

Desarrollar una clase que represente un punto en el plano y tenga los siguientes métodos: inicializar los valores de x e y que llegan como parámetros, imprimir en que cuadrante se encuentra dicho punto (concepto matemático, primer cuadrante si x e y son positivas, si x<0 e y>0 segundo cuadrante, etc.)

Programa: ejercicio191.py

Ver video

class Punto:

    def __init__(self,x,y):
        self.x=x
        self.y=y

    def imprimir(self):
        print("Coordenada del punto")
        print("(",self.x,",",self.y,")")

    def imprimir_cuadrante(self):
        if self.x>0 and self.y>0:
            print("Primer cuadrange")
        else:
            if self.x<0 and self.y>0:
                print("Segundo cuadrante")
            else:
                if self.x<0 and self.y<0:
                    print("Tercer cuadrante")
                else:
                    if self.x>0 and self.y<0:
                        print("Cuarto cuadrante")


# bloque principal

punto1=Punto(10,-2)
punto1.imprimir()
punto1.imprimir_cuadrante()

En este problema el método __init__ aparte del parámetro self que siempre va tenemos otros dos parámetros:

    def __init__(self,x,y):
        self.x=x
        self.y=y

Desde el bloque principal donde creamos un objeto de la clase Punto pasamos los datos a los parámetros:

punto1=Punto(10,-2)

Recordemos que pasamos dos parámetros aunque el método __init__ recibe 3. El parámetro self recibe la referencia de la variable punto1 (es decir el objeto propiamente dicho)

Problemas propuestos

  • Desarrollar una clase que represente un Cuadrado y tenga los siguientes métodos: inicializar el valor del lado llegando como parámetro al método __init__ (definir un atributo llamado lado), imprimir su perímetro y su superficie.

    Ver video

  • Implementar la clase Operaciones. Se deben cargar dos valores enteros por teclado en el método __init__, calcular su suma, resta, multiplicación y división, cada una en un método, imprimir dichos resultados.

    Ver video

Solución
ejercicio192.py

class Cuadrado:

    def __init__(self,lado):
        self.lado=lado

    def mostrar_perimetro(self):
        per=self.lado*4
        print("El perimetro del cuadrado es:",per)

    def mostrar_superficie(self):
        sup=self.lado*self.lado
        print("La superficie del cuadrado es:",sup)


# bloque principal

cuadrado1=Cuadrado(12)
cuadrado1.mostrar_perimetro()
cuadrado1.mostrar_superficie()




ejercicio193.py

class Operaciones:

    def __init__(self):
        self.valor1=int(input("Ingrese primer valor:"))
        self.valor2=int(input("Ingrese segundo valor:"))

    def sumar(self):
        su=self.valor1+self.valor2
        print("La suma es",su)

    def restar(self):
        re=self.valor1-self.valor2
        print("La resta es",re)

    def multiplicar(self):
        pro=self.valor1*self.valor2
        print("El producto es",pro)

    def division(self):
        divi=self.valor1/self.valor2
        print("La division es",divi)


# bloque principal

operacion1=Operaciones()
operacion1.sumar()
operacion1.restar()
operacion1.multiplicar()
operacion1.division()