Ist Python dict-Objekt?
Ich habe eine dict
wie diese:
>>> my_dict = {u'2008': 6.57, u'2009': 4.89, u'2011': 7.74,
... u'2010': 7.44, u'2012': 7.44}
Ausgabe mit has_key
:
>>> my_dict.has_key(unicode(2012))
True
Ausgabe mit hasattr
:
>>> hasattr(my_dict, unicode(2012))
False
Konnte ich nicht verstehen, warum dies verhält sich anders.
Ich gegoogelt und fand heraus, dass es ist, weil dict
und Objekte unterschiedlich sind.
Aber trotzdem konnte ich nicht verstehen den Unterschied richtig.
(BTW : ich verwende python 2.7)
- Übrigens:
has_key
ist veraltet und wurde entfernt in Python ist3. Verwendenthe_key in the_dictionary
statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
dict
Instanzen sind Objekte zu. Aber Ihre Tasten sind einfach nicht so ausgesetzt wie als Attribute.Freilegung der Schlüssel als Attribute (zu oder anstelle der Element-Zugriff) führen würde, um namespace pollution; Sie würden nie in der Lage zu verwenden, eine
has_key
- Taste, zum Beispiel.has_key
ist bereits ein Attribut auf Wörterbücher:Attribute der Objekte und den Inhalt von Wörterbüchern sind zwei separate Dinge, und die Trennung ist auch so gewollt.
Können Sie immer Unterklasse
dict
zum hinzufügen von Attribut-Zugriff unter Verwendung des__getattr__()
hook-Methode:Demo:
Bestehenden Attribute auf die
dict
Klasse Priorität:dct.keys()
,dct.items()
usw. Wenn dictionary-Inhalte wurden auch Attribute, verschmutzen Sie diesen namespace; Sie beginnen, mischen zusätzliche Namen hinein.__getattr__
Haken bedeutet, dass die vorhandenen Attribute auf das Wörterbuch an Erster Stelle. Alle Tasten, die passend zu den vorhandenen Attribute werden so maskiert und nicht zugleich auch als Attribute.has_key
prüft das Vorhandensein eines Schlüssels im Wörterbuch. (Man definiert Ihr code während der Erstellung eines Wörterbuches)hasattr
überprüft, ob das Objekt ein Attribut hat.Wörterbücher sind Objekte, und Sie haben bestimmte Attribute.
hasattr
prüft diese.Können Sie
dir()
die Listen der gültigen Attribute für ein Objekt.my_dict.has_key(unicode(2012))
:has_key
sucht nach einem Schlüssel in einem dictionary. Schlüssel im Wörterbuch sind keine Attribute undaus denen Sie sehen können, dass, obwohl dict-Objekte sind, dict keys sind nicht das dict den Attributen;
Dict ist ein Objekt, wie alles in Python ist ein Objekt. Es gibt jedoch einen Unterschied zwischen einem Objekt-Attribut und ein dicts-Taste.
Das dict nicht speichern Sie Ihren Schlüssel als Attribute!
Der einzige Weg, um eine dicts-Schlüssel ist durch die
__getitem__
- Methode oder die[]
Betreiber.Wenn Sie möchten, um Zugriff auf die Elemente auf diese Weise können Sie überschreiben die
__getattr__
Methode und die Rückkehr der__getitem__
Folge statt.Können Sie auch schaffen, so etwas wie dieses:
Sind die Folge dieses Verhaltens:
Aber das ist bekannt, dass memory leaks in Python
attribute
gibt einige Eigenschaft einer Instanz, so dass Sie es Bearbeiten.Jetzt verstehen
attribute
immer wieder etwas, aber wenn einekey
ist nicht ind
,d[key]
erhöhenKeyError
.hasattr
geprüft, ob eininstantce
hat, dassattribute
oder nicht. Dadictionary
keys
keineattribute
zu dendictionary
es gibtFalse
.Beispiel :