Question

juste rencontré un problème à dict « type » sous-classement. Je l'ai fait la méthode de remplacement et attendu qu'il aura une incidence sur d'autres méthodes comme iterkeys, clés, etc., parce que je croyais qu'ils appellent __iter__ méthode pour obtenir des valeurs, mais il semble qu'ils sont mis en oeuvre indépendamment et je dois passer outre tous.

Est-ce un bug ou intention qu'ils ne font pas usage d'autres méthodes et extrait les valeurs séparément?

Je ne trouve pas dans la description de la documentation standard Python de la dépendance des appels entre les méthodes de classes standard. Il serait très pratique pour sublassing travail et d'orientation les méthodes est nécessaire pour remplacer un comportement approprié. Y at-il une documentation supplémentaire sur les types de base de python / classes internes?

Était-ce utile?

La solution

Sous Mapping ou MuteableMapping du module de collections au lieu de dict et vous obtenez toutes ces méthodes gratuitement.

Voici un exemple d'une cartographie minimale et quelques-unes des méthodes que vous obtenez gratuitement:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

Pour la sous-classe l'un des conteneurs BUILTIN vous devriez toujours utiliser la classe de base appropriés à partir du module collections.

Autres conseils

Si non spécifié dans la documentation, il est spécifique de mise en œuvre . Autre que CPython Implémentations pouvait employer la méthode iter pour mettre en œuvre iterkeys et d'autres. Je ne considère pas que ce soit un bug, mais simplement un peu de liberté pour les implémenteurs.

Je soupçonne qu'il est un facteur de performance dans l'application des méthodes indépendamment, d'autant plus que les dictionnaires sont si largement utilisés en Python.

Donc, fondamentalement, vous devez les mettre en œuvre.

Vous connaissez le dicton: « Vous savez ce qui se passe quand vous assumez. » :-)

Ils ne documentent pas officiellement ce genre de choses parce qu'ils peuvent décider de changer à l'avenir. Toute documentation non officielle que vous pouvez trouver serait simplement documenter le comportement actuel d'une mise en œuvre Python, et compter sur elle entraînerait votre code étant très, très fragile.

Lorsque la documentation officielle des méthodes particulières, il a tendance à décrire le comportement de l'interprète par rapport à vos propres classes, comme l'utilisation __len__() lorsque __nonzero__() n'est pas mis en œuvre, ou seulement besoin __lt()__ pour le tri.

Depuis Python utilise la saisie de canard, vous ne sont généralement pas réellement besoin d'hériter d'une classe intégrée pour faire votre propre acte de classe comme l'un. Donc, vous pourriez reconsidérer si dict est vraiment sous-classement ce que vous voulez faire. Vous pouvez choisir une autre classe, par exemple comme quelque chose à partir du module collections, ou plutôt que d'encapsuler héritant. (La classe UserString utilise l'encapsulation.) Ou tout simplement commencer à partir de zéro.

Au lieu de sous-classement dict, vous pouvez créer au lieu simplement faire votre propre classe qui a exactement les propriétés que vous voulez sans trop de problèmes. Voici un blog après un exemple de la façon de le faire. La méthode de __str__() dans ce n'est pas le plus grand, mais qui est facilement corrigé le reste de fournir la fonctionnalité que vous cherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top