Estoy siguiendo un tutorial en línea y el código es el siguiente:
class Hands(list): def __init__(self, size=0, die_class=None, *args, **kwargs): if not die_class: raise ValueError("You must provide a die class") super().__init__() for _ in range(size): self.append(die_class())
Básicamente, modela a un jugador con un número de dados ( size
) y qué dados tienen ( die_class
).
Mi confusión es por qué necesitamos llamar a super().__init__
? Intenté ejecutar el código sin él y funcionó bien! ¿Por qué es necesaria la llamada?
__init__()
llamar al __init__()
si la clase base para asegurarse de que se ejecuta cualquier código de inicialización. Que (parece) que funcione sin esa llamada puede ser una coincidencia, o que simplemente no hayas encontrado el problema resultante todavía. Incluso si funciona de manera consistente en la versión de Python y la implementación que está utilizando actualmente, no se garantiza que otras versiones e implementaciones funcionen sin llamar al método __init__
clase base.
También puedes usar esa llamada para completar la lista con tus objetos dados:
class Hands(list): def __init__(self, size=0, die_factory=None): if not die_factory: raise ValueError('You must provide a die factory') super().__init__(die_factory() for _ in range(size))
He cambiado el nombre de die_class
a die_factory
ya que se puede usar cualquier objeto que produzca un nuevo objeto die.
Nota: Puede violar la relación is-a entre Hands
y la list
aquí, a menos que un objeto Hands
realmente una list
, es decir, todos los métodos y el comportamiento de las listas también tienen sentido para los objetos Hands
.
super()
permite evitar referirse explícitamente a la clase base. Más importante aún, con la herencia múltiple, puedes hacer cosas como esta . Al final del día, no es necesario, es solo una buena práctica.