Perché tutti i nomi in dir (x) non sono validi per l'accesso agli attributi?
-
20-08-2019 - |
Domanda
Perché un programmatore inserisce elementi in __dict__
che non possono essere utilizzati per l'accesso agli attributi? Ad esempio, nella mia istanza Plone, dir(portal)
include index_html
, ma portal.index_html
aumenta AttributeError. Questo vale anche per l'attributo __class__
di Products.ZCatalog.Catalog.mybrains
. C'è una buona ragione per cui dir()
non ci si può fidare?
Cercando nel modulo inspect
, vedo che usano object.__dict__['x']
invece dell'accesso agli attributi per questo motivo e perché non vogliono innescare getattr
magia.
Soluzione
Non conosco Plone, quindi quanto segue è generale.
Da i documenti di dir
:
Se l'oggetto ha un metodo denominato
__dir__()
, questo metodo verrà chiamato e deve restituire l'elenco di attributi. Questo permette agli oggetti che implementare un__getattr__()
personalizzato o__getattribute__()
funzione per personalizzare il modo in cuidir()
segnala il loro attributi.
Sto solo indovinando qui, ma posso pensare a due cose che potrebbero accadere--
-
L'oggetto ha un metodo
obj.__dict__
che restituisce attributi che non ha -
(meno probabile) L'oggetto ha l'attributo che stai chiedendo (ovvero è in
type(obj).__dict__
o__getattr__
, ma sostituisceAttributeError
per restituire__dir__
MODIFICA : __methods__
è supportato solo in Python 2.6+, tuttavia gli attributi speciali (obsoleti) __members__
e <=> possono essere utilizzati invece per le versioni precedenti.