Constructores alternativos

Python también te permite definir métodos de clase, utilizando el decorador @classmethod y un primer argumento especial cls. El principal uso de los métodos de clase es definir métodos que devuelvan una instancia de la clase, pero que no utilicen el mismo código que __init__().

Por ejemplo, estás desarrollando un paquete de series temporales y quieres definir tu propia clase para trabajar con fechas, BetterDate. Los atributos de la clase serán year, month, y day. Quieres tener un constructor que cree objetos BetterDate dados los valores de año, mes y día, pero también quieres poder crear objetos BetterDate a partir de cadenas como 2020-04-30.

Puede que te resulten útiles las siguientes funciones:

  • El método .split("-") dividirá una cadena en"-" en una matriz, por ejemplo "2020-04-30".split("-") devuelve ["2020", "04", "30"],
  • int() convertirá una cadena en un número, por ejemplo int("2019") es 2019.

Este ejercicio forma parte del curso

Programación orientada a objetos en Python

Ver curso

Ejercicio interactivo práctico

Pruebe este ejercicio completando este código de muestra.

class BetterDate:    
    # Constructor
    def __init__(self, year, month, day):
      # Recall that Python allows multiple variable assignments in one line
      self.year, self.month, self.day = year, month, day
    
    # Define a class method from_str
    ____
    def from_str(____, datestr):
        # Split the string at "-" and convert each part to integer
        parts = datestr.split("-")
        year, month, day = int(parts[0]), ____, ____
        # Return the class instance
        ____ ____(____, ____, ____)
        
bd = BetterDate.from_str('2020-04-30')   
print(bd.year)
print(bd.month)
print(bd.day)