Sous-classement dict: faut-dict.__init__() s'appelle?

Ici est une double question, avec une partie théorique et pratique:

Lorsque le sous-classement dict:

class ImageDB(dict):
    def __init__(self, directory):
        dict.__init__(self)  # Necessary?? 
        ...

devrait dict.__init__(self) être appelés, tout comme une "sécurité" mesurer (par exemple, dans le cas où il y a quelques non-trivial détails de l'implémentation de la matière)? il y a un risque que le code de rompre avec une future version de Python si dict.__init__() est pas appelé? Je suis à la recherche d'une raison fondamentale de faire une chose ou l'autre, ici (dans la pratique, l'appel de dict.__init__() est sûr).

Ma conjecture est que lorsque ImageDB.__init__(self, directory) est appelé, en soi, est déjà un nouvel vide dict objet, et qu'il n'est donc pas nécessaire de faire appel dict.__init__ (je veux le dict vide, au premier abord). Est-ce correct?

Modifier:

Le plus pratique question derrière la question fondamentale ci-dessus est le suivant. Je pensais de sous-classement dict parce que je voudrais utiliser la db[...] la syntaxe assez souvent (au lieu de faire de la db.contenu[...] tout le temps); l'objet est seulement de données (attribut) est en effet vraiment un dict. Je veux ajouter quelques méthodes à la base de données (comme get_image_by_name(), ou get_image_by_code(), par exemple), et remplacez uniquement les __init__(), parce que l'image de la base de données est défini par le répertoire qui le contient.

En résumé, l' (pratique) la question pourrait être: ce qui est une bonne mise en œuvre pour quelque chose qui se comporte comme un dictionnaire, sauf que son initialisation est différent (il suffit d'un nom de répertoire), et qu'il a d'autres méthodes?

"Usines" ont été mentionnés dans de nombreuses réponses. Donc je suppose que tout cela se résume à: ne vous sous-classe dict, remplacer __init__() et ajouter des méthodes, ou écrivez-vous un (réglage d'usine) la fonction qui retourne un dict, à laquelle vous pouvez ajouter des méthodes? Je suis enclin à préférer la première solution, parce que l'usine de la fonction retourne un objet dont le type n'indique pas qu'il a une sémantique supplémentaire et des méthodes, mais qu'en pensez-vous?

Edit 2:

Je déduis de tout le monde de répondre que c'est pas une bonne idée de la sous-classe dict lorsque la nouvelle de la classe "n'est pas un dictionnaire", et en particulier lors de son __init__ méthode ne peut pas prendre les mêmes arguments que dict est __init__ (ce qui est le cas dans la "question pratique" ci-dessus). En d'autres termes, si je comprends bien, le consensus semble être: lorsque vous sous-classe, toutes les méthodes (y compris l'initialisation) doit avoir la même signature que les méthodes de classe de base. Cela permet isinstance(subclass_instance, dict), afin de garantir que subclass_instance.__init__() peut être utilisé comme dict.__init__(), par exemple.

Une autre question d'ordre pratique s'ouvre alors: comment une classe qui est juste comme dict, à l'exception de sa méthode d'initialisation, être mis en œuvre? sans sous-classement? cela aurait besoin d'un peu gênant code réutilisable, non?

  • Une usine de la fonction est le chemin à parcourir. Si vous avez besoin de personnaliser instance de comportement, alors vous voudrez peut-être créer une sous-classe. Si vous voulez juste pour remplacer l'initialisation, vous n'avez pas besoin de sous-classement quoi que ce soit, parce que votre cas ne sont pas différents de la norme, celles. Rappelez-vous que init n'est pas considéré comme faisant partie de l'interface de l'instance, mais de la classe.
  • Aussi loin que je le vois pour ce problème, il serait préférable d'ajouter les __getitem__ méthode à votre ImageDB au lieu de sous-classement d'un dict, parce que ce n'est pas un dict. Cela permet de faire ce que vous voulez, sans avoir toutes ces méthodes comme pop() qui semblent être inapproprié pour votre classe.
  • Bon point, à propos de la pop, c'est en effet, pour le moment du moins, hors de propos (le contenu de base de données est définie lors de l'initialisation seulement). Je pense que c'est bien meilleur que la mise en œuvre étroitement adapter les fonctionnalités nécessaires.