2009-01-27 6 views
3

Pourquoi un codeur insère-t-il des choses dans __dict__ qui ne peuvent pas être utilisées pour l'accès aux attributs? Par exemple, dans mon instance Plone, dir(portal) inclut index_html, mais portal.index_html déclenche AttributeError. Cela est également vrai pour l'attribut __class__ de Products.ZCatalog.Catalog.mybrains. Y a-t-il une bonne raison de ne pas faire confiance à dir()?Pourquoi tous les noms de dir (x) ne sont-ils pas valides pour l'accès aux attributs?

En passant autour du module inspect, je vois qu'ils utilisent object.__dict__['x'] au lieu de l'accès d'attribut pour cette raison et parce qu'ils ne veulent pas déclencher getattr magique.

Répondre

2

Je ne connais pas Plone, donc ce qui suit est général.

De the docs de dir:

Si l'objet a une méthode nommée __dir__(), cette méthode sera appelée et doit retourner la liste des attributs . Ceci permet aux objets qui implémentent une fonction personnalisée __getattr__() ou __getattribute__() de personnaliser la façon dont dir() signale leurs attributs .

juste deviner ici, mais je peux penser à deux choses qui peuvent être happening--

  • L'objet a une méthode __dir__() qui retourne les attributs qu'il n'a pas

  • (moins probable) L'objet a l'attribut que vous demandez (c'est-à-dire qu'il est dans obj.__dict__ ou type(obj).__dict__, mais remplace __getattr__ pour retourner AttributeError

EDIT: __dir__ est pris en charge en Python 2.6+, mais les (déconseillés) attributs spéciaux __methods__ et __members__ peuvent être utilisés à la place pour les versions antérieures.

+0

'__dir__' est nouveau dans python 2.6, et IIRC Zope ne fonctionne toujours pas sur quelque chose de plus récent que python 2.4. – habnabit

+0

C'est vrai, j'utilise Python 2.4. Zope ne fonctionne pas encore officiellement sur un nouveau Python bien que cela ait été fait expérimentalement. – joeforker

Questions connexes