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.

È stato utile?

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 cui dir() 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 sostituisce AttributeError 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top