2009-11-02 4 views
1

Je suis en train de lire Dive Into Python par Mark Pilgrim, et je suis arrivé à la section sur l'héritage. Dans section 5.5, Pilgrim mentionne les différences entre hériter de la classe wrapper UserDict et hériter du type dict intégré.Hériter directement à partir d'un type intégré par rapport à sa classe wrapper en Python

Je n'arrive pas à comprendre pourquoi quelqu'un pourrait même s'embêter avec la classe wrapper ... Quels sont les avantages d'hériter de la classe wrapper UserDict (ou de l'une des autres classes UserXxx)?

Votre contribution est très appréciée. Merci!

Répondre

3

Vous avez raison:

La nécessité de cette classe a été largement supplanté par la capacité à sous-classe directement à partir dict (une caractéristique qui est devenu disponible à partir de la version Python 2.2). Avant l'introduction de dict, la classe UserDict a été utilisée pour créer sous-classes de type dictionnaire qui ont obtenu de nouveaux comportements en remplaçant méthodes existantes ou en en ajoutant de nouvelles.

Notez la première phrase. Cela vient du documentation de UserDict.

Oh, et en Python 3 c'est parti.

3

Les classes wrapper ont été supprimées de Python 3, car elles ne sont plus très utiles depuis longtemps. La classe mixin, UserDict.DictMixin, est une histoire complètement différente - ses fonctionnalités utiles se trouvent maintenant partout dans les "classes de base abstraites" dans le module collections (Python 2.6 et 3. *).

1

Je trouve, sur la page que vous avez lié à, une indication quant à la réponse:

Dans les versions de Python avant 2.2, vous ne pouvez pas sous-classe directement types de données intégrés comme des cordes, listes et dictionnaires. Pour compenser pour cela, Python est livré avec wrapper classes qui imitent le comportement de ces types de données intégrés: UserString, UserList et UserDict. En utilisant une combinaison des méthodes normales et spéciales , la classe UserDict fait une excellente imitation d'un dictionnaire. Dans Python 2.2 et versions ultérieures, vous pouvez hériter des classes directement à partir des types de données intégrés comme dict.

En réalité, aujourd'hui, vous voulez probablement sous-classe dict, plutôt que UserDict.

Questions connexes