Fundamentos de POO para interfaces gráficas en Python

Método constructor

Una peculiaridad interesante que tienen los objetos, es que al crearse pueden recibir unos valores iniciales para establecerlos en sus posibles atributos internos. Esto es gracias a un método especial de las clases llamado constructor:

objetos.py

class Galleta:
    sabor = "dulce"
    chocolate = False

    def __init__(self):
    	print("Soy una galletita recién horneada")

galleta = Galleta()

Si quisiéramos establecer los valores iniciales de los atributos sabor y chocolate sería tan sencillo como definirlos como parámetros y enviarlos durante la instanciación:

class Galleta:
    sabor = "dulce"
    chocolate = False

    def __init__(self, sabor, chocolate):
        self.sabor = sabor
        self.chocolate = chocolate
        print("Soy una galletita recién horneada")

    def chocolatear(self):
        self.chocolate = True


# galleta = Galleta("Salada", False)
galleta = Galleta(sabor="Salada", chocolate=False)
print(galleta.sabor)
print(galleta.chocolate)

Si utilizamos este método tendremos que enviar siempre los dos valores u ocurrirá un error:

galleta = Galleta()

Podemos solucionarlo añadiendo un valor por defecto igual que ocurre con los parámetos de las funciones:

def __init__(self, sabor="dulce", chocolate=False):

Sin embargo al hacer esto los atributos de clase pierden su sentido, por eso no casi nunca se suelen utilizar:

class Galleta:

    def __init__(self, sabor="dulce", chocolate=False):
        self.sabor = sabor
        self.chocolate = chocolate
        print("Soy una galletita recién horneada")

    def chocolatear(self):
        self.chocolate = True


galleta = Galleta()
print(galleta.sabor)
print(galleta.chocolate)