Subclasificando una lista en python

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.