Pourquoi tous les noms dans dir (x) ne sont-ils pas valides pour l'accès aux attributs?
-
20-08-2019 - |
Question
Pourquoi un codeur insère-t-il dans __dict__
des éléments qui ne peuvent pas être utilisés pour l'accès aux attributs? Par exemple, dans mon instance Plone, dir(portal)
inclut index_html
, mais portal.index_html
déclenche AttributeError. Ceci est également vrai pour l'attribut __class__
de Products.ZCatalog.Catalog.mybrains
. Existe-t-il une bonne raison pour ne pas pouvoir faire confiance à dir()
?
En fouillant dans le module inspect
, je vois qu'ils utilisent object.__dict__['x']
au lieu d'un accès par attribut pour cette raison et parce qu'ils ne veulent pas déclencher getattr
magie.
La solution
Je ne sais pas à propos de Plone, ce qui suit est général.
De la documentation de dir
:
Si l'objet a une méthode nommée
__dir__()
, cette méthode sera appelée et doit renvoyer la liste des les attributs. Cela permet aux objets qui implémenter une coutume__getattr__()
ou__getattribute__()
fonction pour personnaliser la façon dontdir()
rapporte leurs attributs.
Devinez juste ici, mais je peux penser à deux choses qui peuvent se produire -
-
L'objet a une
obj.__dict__
méthode qui renvoie des attributs qu'il n'a pas -
(moins probable) L'objet a l'attribut que vous demandez (c'est-à-dire dans
type(obj).__dict__
ou__getattr__
, mais remplaceAttributeError
pour renvoyer__dir__
MODIFIER : __methods__
n'est pris en charge que par Python 2.6+. Toutefois, les attributs spéciaux (obsolètes) __members__
et <=> peuvent être utilisés à la place pour les versions antérieures.