Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recherche sur les attributs d'un objet (suite)

22 réponses
Avatar
Francois
Bonjour à tous,

en fait, je souhaitais remonter un vieux post. Celui-ci :
http://groups.google.fr/group/fr.comp.lang.python/browse_thread/thread/7fde7231705c24e6
Mais il est trop vieux et n'existe plus dans mon lecteur de news. Donc
j'en créé un nouveau.

Le posteur original du message demandais comment obtenir les attributs
d'un objet. J'avais proposé de faire :

print obj.__dict__

On (Bruno en l'occurrence) avait rectifié en disant ceci :

« Ca ne renverra que les attributs de l'instance. Pour avoir tous les
attributs de l'objet, utilise dir(obj). »

Voici mes questions :

1) Je ne saisi pas trop la différence dans cette phrase entre "attributs
de l'instance" et "attributs de l'objet". Plus exactement, je ne saisi
pas trop la différence dans cette phrase entre "instance" et "objet".
Pour moi, un objet c'est toujours une instance de quelque chose. Donc
pour moi dire "attribut d'instance" ou "attribut d'objet" c'est censé
être la même chose. Est-ce possible d'avoir une explication sur ce point ?

2) J'ai l'impression que dir() affiche bien plus que les attributs d'un
objet. Par exemple avec ceci

#-----------------------
class Mc(object):
version = '1.0'

obj = Mc()
#-----------------------

dir(Mc) et dir(obj) me donneront (entre autres) 'version' comme
"attribut". Mais pour moi version est un attribut de Mc uniquement, mais
pas de obj. Bien sûr, obj.version va me renvoyer '1.0' mais lors de la
recherche de l'attribut, c'est dans l'objet classe Mc que version sera
trouvé et non dans l'objet obj. Est-ce correct ?

Dans ce cas, si obj désigne un objet quelconque (classe ou instance
etc...), existe-t-il une instruction pour afficher uniquement tous les
attributs qui appartiennent à obj et seulement ceux qui appartiennent à
obj ?

Merci d'avance.

--
François

10 réponses

1 2 3
Avatar
Eric Brunel
On Fri, 22 Aug 2008 11:31:25 +0200, Francois wrote:
[snip]
De même, la distinction entre attribut d'instance et
attribut de classe n'est pas hyper-tranchée non plus: tu peux avoir des
attributs calculés définis au niveau de la classe qui vont renvoyer des
valeurs différentes en fonction de l'instance. Ou pas, comme dans
l'exemple ci-dessus... Donc demander à ne récupérer que les attributs
d'une instance n'a pas forcément grand sens...



... ben en fait, dans mon esprit, les choses étaient tranchées avant que
je ne lance ce post. Je voyais les choses ainsi :

un objet obj possède un espace de noms que j'appelle N, qui contient (ou
pas) des noms de variables (on peut avoir N = vide). Pour moi, les
attributs de l'objet obj sont tous les objets liés aux noms de variables
appartenant à N.



Si c'est ça que tu veux, ton espace de nom N est strictement obj.__dict__.
Mais comme tu as pu le constater, ça ne va pas t'amener très loin...

Donc dans mon esprit, avec cette façon de voir, il y avait une
distinction très tranchée et nette entre attribut d'une instance donnée
et attribut de la classe.

Mais, ce n'est pas comme cela qu'il faut concevoir le modèle objet ?



Concevoir, je ne sais pas... Mais le fait est qu'en Python, un objet o
donne accès à plein de choses qui ne sont pas dans o.__dict__. Donc se
limiter aux attributs présents dans o.__dict__ paraît a priori très
limitatif. Mais comme d'habitude, tout dépend de ce qu'on veut en faire
après...

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
Avatar
Francois
Eric Brunel a écrit :
un objet obj possède un espace de noms que j'appelle N, qui contient
(ou pas) des noms de variables (on peut avoir N = vide). Pour moi, les
attributs de l'objet obj sont tous les objets liés aux noms de
variables appartenant à N.



Si c'est ça que tu veux, ton espace de nom N est strictement
obj.__dict__. Mais comme tu as pu le constater, ça ne va pas t'amener
très loin...

Donc dans mon esprit, avec cette façon de voir, il y avait une
distinction très tranchée et nette entre attribut d'une instance
donnée et attribut de la classe.

Mais, ce n'est pas comme cela qu'il faut concevoir le modèle objet ?



Concevoir, je ne sais pas... Mais le fait est qu'en Python, un objet o
donne accès à plein de choses qui ne sont pas dans o.__dict__. Donc se
limiter aux attributs présents dans o.__dict__ paraît a priori très
limitatif.



Oui oui, j'avais posté un message (après celui auquel tu fais référence)
qui abondait dans ton sens. Effectivement, l'espace de nom d'un objet
obj et les objets que l'on peut atteindre via obj.x n'ont très souvent
rien à voir. Par exemple si f est une méthode, l'objet obj.f ne se
trouve ni dans l'espace de nom de obj, ni dans celui de Mc d'ailleurs
(où Mc est la classe de obj). Même l'objet Mc.f n'est pas dans l'espace
de nom de Mc !

Merci bien.


--
François
Avatar
Méta-MCI (MVP)
Bonsoir !

Tu aurais pu choisir autre chose que "MC" pour ta classe.
À chaque fois, je crois qu'on parle de moi, dans mon dos...

@+

Michel Claveau
Avatar
Francois
Méta-MCI (MVP) a écrit :
Bonsoir !

Tu aurais pu choisir autre chose que "MC" pour ta classe.
À chaque fois, je crois qu'on parle de moi, dans mon dos...



Ah ! Mais peut-être y a-t-il des messages subliminaux dans mes exemples ?

from random import choice

class MC(object):
def __init__(self):
self.ma_liste = Reponses_enigmatiques()
def repondre_a_une_question(self):
print choice(self.ma_liste)
def dire_au_revoir(self):
print "@+"

:-)

--
François (blagueur)
Avatar
Bruno Desthuilliers
Francois a écrit :
Merci bien pour vos réponses respectives.

Effectivement, je comprends bien l'erreur qui consiste à dire que seuls
les objets référencés dans l'espace de nom de obj sont des attributs de
obj. En effet, une méthode n'est jamais dans l'espace de nom d'une
instance



"jamais" ?-)

def foo(obj):
print obj

class Bar(object):
def __init__(self):
self.foo = foo.__get__(self, type(self))

b = Bar()
b.foo()
print b.foo, b.__dict__['foo']


et pourtant on parle bien de "méthodes liées à un objet
instance". Si C est une classe dans laquelle on définit une méthode m



<pedant>
A vrai dire, ce qui est défini dans C est une fonction. C'est lors de la
résolution d'attribut que la méthode est instanciée.
</pedant>

et
si o1 et o2 sont deux instances de C, alors les objets o1.m et o2.m sont
tous les deux des objets méthodes bien distincts,



Ce qui ne prouve rien, puisque tu a le même comportement avec deux
lookups successif de o1.m :

m1 = o1.m
m2 = o1.m

m1 is m2
=> False

et sont bien des
méthodes liées chacune respectivement à o1 et o2, donc on peut vraiment
dire que ce sont des attributs respectivement de o1 et o2 (vu qu'ils
sont liés avec eux).

En résumé :

« m attribut de C » : pas de sens.



"m attribut de C" <=> C.m ne lève pas un AttributeError.

« C.m attribut de C » : oui c'est un objet méthode non liée
« o1.m attribut de o1 » : oui c'est un objet méthode liée à o1

Désolé pour ces trivialités. Je confondais la notion d'attribut (issu du
*modèle* objet)



Comme pour la majorité des "concepts" OO, il n'y a en fait aucune
définition universelle et non-ambigüe du terme "attribut". Si on se
tient au contexte spécifique du modèle objet de Python, un objet A est
attribut d'un objet O si l'expression O.A est résolue - c'est à dire, ne
lève pas un AttributeError.

avec la notion d'espace de nom qui relève plutôt de
*l'implémentation* du modèle objet en Python.

Merci bien pour votre aide.



Avatar
Francois
Merci bien pour ta réponse Bruno.


Bruno Desthuilliers a écrit :
Effectivement, je comprends bien l'erreur qui consiste à dire que
seuls les objets référencés dans l'espace de nom de obj sont des
attributs de obj. En effet, une méthode n'est jamais dans l'espace de
nom d'une instance



"jamais" ?-)

def foo(obj):
print obj

class Bar(object):
def __init__(self):
self.foo = foo.__get__(self, type(self))

b = Bar()
b.foo()
print b.foo, b.__dict__['foo']



Certes, mais c'est de la triche. :-)


et pourtant on parle bien de "méthodes liées à un objet instance". Si
C est une classe dans laquelle on définit une méthode m



<pedant>
A vrai dire, ce qui est défini dans C est une fonction. C'est lors de la
résolution d'attribut que la méthode est instanciée.
</pedant>



Absolument d'accord. D'ailleurs C.__dict__['m'] est un objet fonction
alors que C.m est un objet méthode : deux objets différents et de type
différent.


et si o1 et o2 sont deux instances de C, alors les objets o1.m et o2.m
sont tous les deux des objets méthodes bien distincts,



Ce qui ne prouve rien, puisque tu a le même comportement avec deux
lookups successif de o1.m :

m1 = o1.m
m2 = o1.m

m1 is m2
=> False



D'accord avec ça (on en a même parlé il y a peu de temps et c'est clair
dans ma tête). Je me rend compte que j'ai mal tourné ma phrase. Je
reformule ce que j'ai voulu dire dans la phrase que tu cites (pas en
entier :-) ) :

« si o1 et o2 sont deux instances de C, alors les objets o1.m et o2.m
(qui sont tous les deux des objets méthodes bien distincts mais c'est
anecdotique ici) sont des méthodes *liées* chacune respectivement à o1
et o2, ce qui conforte l'idée que ces méthodes sont bien des attributs
de o1 et o2 (idée que je contestais au début du fil) »


En résumé :

« m attribut de C » : pas de sens.



"m attribut de C" <=> C.m ne lève pas un AttributeError.



Ça me plaît bien comme définition.

Pourtant il y a un truc qui m'ennuie. Dans la partie gauche de
l'équivalence, quel objet est représenté par l'identificateur m ? m (je
veux dire par là C.__dict__['m']) ou C.m (qui peuvent être des objets
bien différents, si m est une méthode par exemple) ? C'est à cause de
cette question que je trouvais que la phrase « m est un attribut de C »
n'avait pas de sens ; parce que je ne sais pas de quel objet Python du
programme on parle quand on dit "m".


Comme pour la majorité des "concepts" OO, il n'y a en fait aucune
définition universelle et non-ambigüe du terme "attribut". Si on se
tient au contexte spécifique du modèle objet de Python, un objet A est
attribut d'un objet O si l'expression O.A est résolue - c'est à dire, ne
lève pas un AttributeError.



Ok, mais j'aimerais juste savoir qui est l'objet A dans cette phrase ?
Est-ce l'objet retourné par O.A ? Est-ce un objet référencé par
l'identificateur A se trouvant dans un espace de nom particulier (lequel
?) ?


--
François
Avatar
Bruno Desthuilliers
Francois a écrit :
Merci bien pour ta réponse Bruno.


Bruno Desthuilliers a écrit :
Effectivement, je comprends bien l'erreur qui consiste à dire que
seuls les objets référencés dans l'espace de nom de obj sont des
attributs de obj. En effet, une méthode n'est jamais dans l'espace de
nom d'une instance



"jamais" ?-)

def foo(obj):
print obj

class Bar(object):
def __init__(self):
self.foo = foo.__get__(self, type(self))

b = Bar()
b.foo()
print b.foo, b.__dict__['foo']



Certes, mais c'est de la triche. :-)




Non, c'est le moyen le plus simple d'ajouter une méthode à une instance
(et non à la classe), et c'est très exactement ce que fait
object.__getattribute__ quand le nom se résoud sur un attribut de classe
implémentant le protocol descripteur - ce qui est le cas des fonctions.

(snip)

"m attribut de C" <=> C.m ne lève pas un AttributeError.



Ça me plaît bien comme définition.

Pourtant il y a un truc qui m'ennuie. Dans la partie gauche de
l'équivalence, quel objet est représenté par l'identificateur m ?



Celui retourné par l'évaluation de l'expression "C.m"

m (je
veux dire par là C.__dict__['m']) ou C.m (qui peuvent être des objets
bien différents, si m est une méthode par exemple) ?


>
C'est à cause de
cette question que je trouvais que la phrase « m est un attribut de C »
n'avait pas de sens ; parce que je ne sais pas de quel objet Python du
programme on parle quand on dit "m".



C'est effectivement un poil flou et ambigü. Il faudrait utiliser deux
termes distincts, un pour C.m et l'autre pour C.__dict__['m'].


Comme pour la majorité des "concepts" OO, il n'y a en fait aucune
définition universelle et non-ambigüe du terme "attribut". Si on se
tient au contexte spécifique du modèle objet de Python, un objet A est
attribut d'un objet O si l'expression O.A est résolue - c'est à dire,
ne lève pas un AttributeError.



Ok, mais j'aimerais juste savoir qui est l'objet A dans cette phrase ?
Est-ce l'objet retourné par O.A ?



cf ci-dessus.

Est-ce un objet référencé par
l'identificateur A se trouvant dans un espace de nom particulier



Pas nécessairement. Cet objet peut venir d'absolument n'importe où,
voire être créé dynamiquement lors de la résolution d'attribut (ce qui
est en général le cas des méthodes).
Avatar
Francois
Bruno Desthuilliers a écrit :
Francois a écrit :
Bruno Desthuilliers a écrit :
"m attribut de C" <=> C.m ne lève pas un AttributeError.



Ça me plaît bien comme définition.

Pourtant il y a un truc qui m'ennuie. Dans la partie gauche de
l'équivalence, quel objet est représenté par l'identificateur m ?



Celui retourné par l'évaluation de l'expression "C.m"



Ok, dans ce cas je suis 100% d'accord avec ta définition. :-)


m (je veux dire par là C.__dict__['m']) ou C.m (qui peuvent être des
objets bien différents, si m est une méthode par exemple) ?

C'est à cause de cette question que je trouvais que la phrase « m est
un attribut de C » n'avait pas de sens ; parce que je ne sais pas de
quel objet Python du programme on parle quand on dit "m".



C'est effectivement un poil flou et ambigü. Il faudrait utiliser deux
termes distincts, un pour C.m et l'autre pour C.__dict__['m'].



C'est pour ça que je disais :
« "m attribut de C" : pas de sens.
"C.m attribut de C" : a un sens etc... »

En revanche, il me semble qu'il n'y a pas d'ambiguïté sur la
dénomination des objets. Pour moi, m représente un objet dont le nom 'm'
se trouve dans un des espace de noms du programme (en regardant d'abord
dans l'espace de noms de C, puis en «remontant» les espaces de noms
jusqu'à ce que le nom 'm' soit trouvé ou pas) tandis que C.m c'est C.m
si j'ose dire (l'objet retourné par l'expression "C.m" pour être précis).

Je dirais que la phrase "m est un attribut de C" est un raccourci
pratique où m signifie l'objet C.m (et dès fois c'est le même objet que
m, mais des fois non).

Je trouve que l'ambiguïté se fait sentir surtout quand on veut signifier
qu'un attribut est «propre» à un objet ou est un attribut «tout-court» à
l'objet (accessible via l'objet), ambiguïté qui était à l'origine de ce
post d'ailleurs. Je reprends l'expression «propre» qui tu avais employée
dans ta première réponse (et qui me plaît bien).

Finalement, je dirai ceci : (O et A sont des objets)

-------------
1) "L'objet O.A est un attribut de l'objet O" si et seulement si O.A ne
lève pas un AttributeError. Dans ce cas, on peut dire "A est un attribut
de O", mais c'est un raccourci avec des non-dits.

2) "L'objet O.A est un attribut *propre* à l'objet O" si et seulement si
O.A ne lève pas un AttributeError et si le nom 'A' appartient à l'espace
de noms de l'objet A. Dans ce cas, on peut dire "A est un attribut
*propre* à O", mais c'est un raccourci avec des non-dits.

Remarque : Dans le cas 2), l'attribut O.A *propre* à l'objet A n'est pas
forcément le même objet que O.__dict__['A'] ; si O est une classe et A
une méthode par exemple.
-------------

Ça se tient ça ? Le terme d'attribut *propre* à un objet est-il utilisé
en général ou c'est un terme comme ça ?


Ok, mais j'aimerais juste savoir qui est l'objet A dans cette phrase ?
Est-ce l'objet retourné par O.A ?



cf ci-dessus.

Est-ce un objet référencé par l'identificateur A se trouvant dans un
espace de nom particulier



Pas nécessairement. Cet objet peut venir d'absolument n'importe où,
voire être créé dynamiquement lors de la résolution d'attribut (ce qui
est en général le cas des méthodes).



Oui, là aussi 100% d'accord.


--
François
Avatar
Bruno Desthuilliers
Francois a écrit :
Bruno Desthuilliers a écrit :
Francois a écrit :
Bruno Desthuilliers a écrit :
"m attribut de C" <=> C.m ne lève pas un AttributeError.



Ça me plaît bien comme définition.

Pourtant il y a un truc qui m'ennuie. Dans la partie gauche de
l'équivalence, quel objet est représenté par l'identificateur m ?



Celui retourné par l'évaluation de l'expression "C.m"



Ok, dans ce cas je suis 100% d'accord avec ta définition. :-)


m (je veux dire par là C.__dict__['m']) ou C.m (qui peuvent être des
objets bien différents, si m est une méthode par exemple) ?

C'est à cause de cette question que je trouvais que la phrase « m est
un attribut de C » n'avait pas de sens ; parce que je ne sais pas de
quel objet Python du programme on parle quand on dit "m".



C'est effectivement un poil flou et ambigü. Il faudrait utiliser deux
termes distincts, un pour C.m et l'autre pour C.__dict__['m'].



C'est pour ça que je disais :
« "m attribut de C" : pas de sens.
"C.m attribut de C" : a un sens etc... »


>
En revanche, il me semble qu'il n'y a pas d'ambiguïté sur la
dénomination des objets. Pour moi, m représente un objet dont le nom 'm'



N'oublie pas que ce n'est qu'un des noms possibles pour cet objet...

se trouve dans un des espace de noms du programme (en regardant d'abord
dans l'espace de noms de C, puis en «remontant» les espaces de noms
jusqu'à ce que le nom 'm' soit trouvé ou pas)



Pour quelle définition de "espace de nom" ? Celui de "objet sur lequel
un nom est résolu" ou celui de "endroit où la référence première à un
object donné est créé" ?-)

Bon, ok, là je n'aide pas vraiment à clarifier le débat. Ceci étant,
c'est bien toute l'ambiguité du terme "attribut" qui se révèle ici. Et
aussi le problème qu'il peut y avoir à vouloir appliquer des concepts
inadéquats à un modèle donné. Dans le cas de Python, on ne travaille
qu'avec des couples nom => référence. En d'autres termes, la notion de
composition n'a pas de sens, puisqu'un objet est vivant tant qu'il y a
une référence dessus, et que donc aucun objet n'"appartient" à un autre
(dans le sens où le cycle de vie d'un objet n'est pas déterminable par
le cycle de vie d'un autre). Bref, le lien le plus fort entre deux
objets est l'aggrégation.

tandis que C.m c'est C.m
si j'ose dire (l'objet retourné par l'expression "C.m" pour être précis).

Je dirais que la phrase "m est un attribut de C" est un raccourci
pratique où m signifie l'objet C.m (et dès fois c'est le même objet que
m, mais des fois non).

Je trouve que l'ambiguïté se fait sentir surtout quand on veut signifier
qu'un attribut est «propre» à un objet ou est un attribut «tout-court» à
l'objet (accessible via l'objet), ambiguïté qui était à l'origine de ce
post d'ailleurs.



Ca va plus loin en fait, puisque le fait que C.m soit résolu par
C.__dict__['m'] (en d'autres termes : (C.m is C.__dict__['m']) == True)
ne rends pas l'objet accessible par l'une ou l'autre syntaxe dépendant
de C pour son cycle de vie. En d'autres termes, quelque soit l'objet o
tel o is C.m and o is C.__dict__['m'] n'implique pas que del C ou
delattr(C, 'm') ou del C.__dict__['m'] aient pour résultats de terminer
le cycle de vie de o. Bref:

Je reprends l'expression «propre» qui tu avais employée
dans ta première réponse (et qui me plaît bien).



même un attribut "propre" à une instance n'appartient pas à cette instance.

Finalement, je dirai ceci : (O et A sont des objets)

-------------
1) "L'objet O.A est un attribut de l'objet O" si et seulement si O.A ne
lève pas un AttributeError. Dans ce cas, on peut dire "A est un attribut
de O",



Oui.

mais c'est un raccourci avec des non-dits.



Lesquels ?

2) "L'objet O.A est un attribut *propre* à l'objet O" si et seulement si
O.A ne lève pas un AttributeError et si le nom 'A' appartient à l'espace
de noms de l'objet A.



Pour quelle définition de "espace de nom" ?

Dans ce cas, on peut dire "A est un attribut
*propre* à O", mais c'est un raccourci avec des non-dits.



Lesquels ?

Remarque : Dans le cas 2), l'attribut O.A *propre* à l'objet A n'est pas
forcément le même objet que O.__dict__['A'] ; si O est une classe et A
une méthode par exemple.





Ça se tient ça ? Le terme d'attribut *propre* à un objet est-il utilisé
en général ou c'est un terme comme ça ?



Pour le moment, c'est un terme "comme ça". Et comme tu peux le
constater, plus on essaie de définir précisément, et plus c'est le bordel.


Ok, mais j'aimerais juste savoir qui est l'objet A dans cette phrase
? Est-ce l'objet retourné par O.A ?



cf ci-dessus.

Est-ce un objet référencé par l'identificateur A se trouvant dans un
espace de nom particulier



Pas nécessairement. Cet objet peut venir d'absolument n'importe où,
voire être créé dynamiquement lors de la résolution d'attribut (ce qui
est en général le cas des méthodes).



Oui, là aussi 100% d'accord.



Sans vouloir être méchant, que tu sois d'accord ou pas n'y change en
l'occurrence pas grand chose !-)
Avatar
Francois
Merci pour ta réponse, même si elle m'a plongé dans un abîme de
perplexité. :-)


Bruno Desthuilliers a écrit :
Pour quelle définition de "espace de nom" ?



Je pensais que l'espace de nom (quand il existe) d'un objet O était
l'ensemble de toutes les clés de l'objet dictionnaire o.__dict__ où o
est un identificateur faisant référence à l'objet O.



Bon, ok, là je n'aide pas vraiment à clarifier le débat. Ceci étant,
c'est bien toute l'ambiguïté du terme "attribut" qui se révèle ici. Et
aussi le problème qu'il peut y avoir à vouloir appliquer des concepts
inadéquats à un modèle donné. Dans le cas de Python, on ne travaille
qu'avec des couples nom => référence.



C'est pas plutôt "nom => objet", non ? Pour moi un nom, c'est déjà en
soi une référence à un objet.



Je trouve que l'ambiguïté se fait sentir surtout quand on veut
signifier qu'un attribut est «propre» à un objet ou est un attribut
«tout-court» à l'objet (accessible via l'objet), ambiguïté qui était à
l'origine de ce post d'ailleurs.



Ca va plus loin en fait, puisque le fait que C.m soit résolu par
C.__dict__['m'] (en d'autres termes : (C.m is C.__dict__['m']) == True)
ne rends pas l'objet accessible par l'une ou l'autre syntaxe dépendant
de C pour son cycle de vie.



Je ne comprends pas cette phrase. Au contraire, il est accessible par
une ou l'autre des syntaxes ?

En d'autres termes, quelque soit l'objet o
tel o is C.m and o is C.__dict__['m'] n'implique pas que del C ou
delattr(C, 'm') ou del C.__dict__['m'] aient pour résultats de terminer
le cycle de vie de o.



car l'objet C.__dict__['m'] peut avoir une référence par d'autre moyen
que par C si je comprends bien ? J'ai du mail à voir le rapport entre
nos histoires d'attributs et les problèmes de durée de vie des objets.



Je reprends l'expression «propre» qui tu avais employée dans ta
première réponse (et qui me plaît bien).



même un attribut "propre" à une instance n'appartient pas à cette instance.



Je ne suis pas sûr de comprendre. J'ai l'impression, en gros, que tu es
en train de m'expliquer que l'expression "propre" peut-être inadaptée
car elle peut laisser penser l'existence d'une notion d'appartenance qui
ne s'applique pas chez Python, où tout est plutôt histoire de références
qui s'entremêlent de façon plus désorganisée qu'il n'y paraît. (Pas sûr
d'avoir restitué fidèlement ce que tu voulais dire ?)



Pour le moment, c'est un terme "comme ça". Et comme tu peux le
constater, plus on essaie de définir précisément, et plus c'est le bordel.



Oui.



Oui, là aussi 100% d'accord.



Sans vouloir être méchant, que tu sois d'accord ou pas n'y change en
l'occurrence pas grand chose !-)



Je ne cherche pas à cautionner tes propos (ce serait un comble). C'est
juste pour signifier que j'ai compris un point précis que tu expliques
et que l'explication coïncide avec ce que je pense. C'est hélas (pour
moi) assez rare et quand ça se produit, même si pour toi ça n'y change
rien, pour moi c'est une petite satisfaction. :-)



J'aimerais bien savoir si tu es d'accord avec ceci ? (j'ai
*essayé* de tenir compte de tes remarques) :

------------
Soit O un objet donné et o est un identificateur faisant référence à
l'objet O.

a) "L'espace de nom" (quand il existe) de l'objet O est l'ensemble de
toutes les clés de l'objet dictionnaire o.__dict__.

b) "L'objet A est un attribut de l'objet O" si et seulement l'objet A
est créé par le programme suite à une référence de la forme o.a ne
levant pas un AttributeError, et où a est un identificateur qu'on
appelle alors le nom de l'attribut A.

c) "L'objet A est un attribut de l'objet O, *résolu* en O" si et
seulement si l'objet A est un attribut de l'objet O (cf b) et si ('a' in
o.__dict__) == True, où a est le nom de l'attribut A.

Remarque : Dans le cas c), l'attribut o.a de l'objet O résolu en O n'est
pas forcément le même objet que o.__dict__['a'] ; si O est une classe et
si A un est descripteur par exemple.
------------




--
François
1 2 3