Frage

nur ein Problem bei dict „Typ“ begegnet Subklassen. Ich habe überschreiben __iter__ Verfahren und erwartet wird es andere Methoden wie iterkeys, Schlüssel beeinflussen usw., weil ich sie nennen __iter__ Methode angenommen, dass Werte zu erhalten, aber es scheint, dass sie unabhängig voneinander durchgeführt werden, und ich muss sie alle außer Kraft setzen.

Ist das ein Bug oder Absicht sie die Verwendung anderer Methoden und abruft Werte nicht separat machen?

Ich fand nicht in der Standard-Python-Dokumentation Beschreibung der Anrufe Abhängigkeit zwischen Methoden der Standardklassen. Es wäre für sublassing Arbeit sehr nützlich sein und zur Orientierung welche Methoden erforderlich ist für das richtige Verhalten außer Kraft zu setzen. Gibt es eine zusätzliche Dokumentation über Python Basistypen / Klassen Interna?

War es hilfreich?

Lösung

Subclass Mapping oder MuteableMapping aus der Sammlungen Modul statt dict und erhalten Sie alle diese Methoden kostenlos.

Hier ist ein Beispiel für ein minimal-Mapping und einige der Methoden, erhalten Sie kostenlos:

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)

Um eine des eingebauten Behälters Unterklasse Sie immer die entsprechende Basisklasse aus der Sammlung Modul verwendet werden sollen.

Andere Tipps

Wenn nicht in der Dokumentation angegeben, es ist Implementierung spezifische . Implementationen andere, dass CPython könnte die Wiederverwendung die iter Methode iterkeys und andere zu implementieren. Ich würde dies nicht als ein Fehler sein, sondern einfach ein bisschen Freiheit für die Implementierer.

Ich vermute, dass es ein Leistungsfaktor ist die Methoden unabhängig bei der Umsetzung, vor allem als Wörterbücher sind so weit verbreitet in Python verwendet.

Also im Grunde, Sie sollten sie implementieren.

Sie kennen das Sprichwort: „Sie wissen, was passiert, wenn Sie davon ausgehen.“ :-)

Sie dokumentieren nicht offiziell das Zeug, weil sie sich entscheiden, kann es in der Zukunft zu ändern. Jede inoffizielle Dokumentation, die Sie finden können einfach das aktuelle Verhalten eines Python-Implementierung dokumentieren würde, und auf sie verlassen würde in Ihrem Code ist sehr, sehr zerbrechlich.

Wenn es offizielle Dokumentation von speziellen Methoden ist, neigt sie dazu, das Verhalten des Interpreters in Bezug auf Ihre eigenen Klassen zu beschreiben, wie __len__() verwenden, wenn __nonzero__() nicht implementiert ist, oder nur __lt()__ benötigt für die Sortierung.

Da Python Ente Typisierung verwendet, Sie in der Regel nicht wirklich braucht, um erbt von einer Klasse in integrierten Ihre eigene Klasse wirkt wie eine zu machen. So könnten Sie überlegen, ob dict Subklassen ist wirklich das, was Sie tun möchten. Sie könnten eine andere Klasse, wie etwas aus dem collections Modul wählen, oder besser gesagt verkapseln als vererben. (Die UserString Klasse verwendet Verkapselung.) Oder einfach von vorne anfangen.

Statt Subklassen dict, könnten Sie stattdessen erstellen Sie einfach Ihre eigene Klasse machen, das hat genau die Eigenschaften, die Sie ohne allzu viel Mühe wollen. Hier ist ein bloggen Post mit einem Beispiel dafür, wie dies zu tun. Die __str__() Verfahren ist es nicht das größte, aber das ist der Rest der Funktionalität leicht korrigiert bieten Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top