Warum sind nicht alle Namen in dir (x) gilt für Attribut-Zugang?
-
20-08-2019 - |
Frage
Warum ein Coder Sache Dinge in __dict__
würde, die für Attribut Zugriff verwendet werden kann, nicht wahr? Zum Beispiel in meiner Plone-Instanz enthält dir(portal)
index_html
, aber portal.index_html
wirft Attribute. Dies gilt auch für das __class__
Attribut Products.ZCatalog.Catalog.mybrains
. Gibt es einen guten Grund, warum dir()
nicht trauen kann?
Stochern der inspect
Modul, ich sehe sie verwenden object.__dict__['x']
statt Attribut Zugriff aus diesem Grund und weil sie nicht wollen, getattr
Magie auslösen.
Lösung
Ich weiß nicht, über Plone, so dass die folgende ist allgemein.
die Dokumentation von dir
:
Wenn das Objekt eine Methode mit dem Namen
__dir__()
, wird diese Methode aufgerufen werden und muss zurückkehren, die Liste der Attribute. Auf diese Weise können Objekte, dass implementieren eine benutzerdefinierte__getattr__()
oder__getattribute__()
Funktion anpassen die Art und Weisedir()
berichtet ihre Attribute.
Erraten Sie hier, aber ich kann zwei Dinge denken, die passieren können -
-
Das Objekt hat eine
__dir__()
Methode, gibt Attribute, die es nicht haben -
(weniger wahrscheinlich) Das Objekt hat das Attribut Sie fragen, für (das heißt, es ist in
obj.__dict__
odertype(obj).__dict__
, aber überschreibt__getattr__
AttributeError
zurück
Bearbeiten : __dir__
wird nur in Python unterstützt 2.6+, aber das (veraltet) spezielle Attribut __methods__
und __members__
kann stattdessen für frühere Versionen verwendet werden.