Je suis un peu surpris qu'on puisse faire une
même chose de trois manières différentes.
Je suis un peu surpris qu'on puisse faire une
même chose de trois manières différentes.
Je suis un peu surpris qu'on puisse faire une
même chose de trois manières différentes.
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj est
l'identifiant d'un objet (nouveau style), instance d'une classe C.
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj est
l'identifiant d'un objet (nouveau style), instance d'une classe C.
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj est
l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je suis un peu surpris qu'on puisse faire une même chose de trois
manières différentes.
Vous devriez feuilleter le Kâma Sûtra...
Je suis un peu surpris qu'on puisse faire une même chose de trois
manières différentes.
Vous devriez feuilleter le Kâma Sûtra...
Je suis un peu surpris qu'on puisse faire une même chose de trois
manières différentes.
Vous devriez feuilleter le Kâma Sûtra...
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
Kobayashi a écrit :1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
Jusque là, cela correspond à ce que je pensais il me semble. Sauf que
moi, je m'étais arrêté à la condition 1. Et d'ailleurs...condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
... je ne saisis pas trop ce que vient faire cette condition 2 qui a à
voir avec la classe C. Je ne vois pas trop le rapport. Pour moi, si le
comportement de __setattr__ n'a pas été changé dans le corps de la
classe C alors obj.__setattr__('x', <valeur>) devient obj.__dict__['x']
= <valeur> et c'est tout. Mais en réalité je n'ai aucune certitude.
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
D'accord.Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
Bon là, je suis perdu, pas sur la logique (là dessus je suis) mais c'est
parce que je ne connais pas vraiment la notion de descripteur.PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
Mais votre réponse est très logique au contraire. Il me manque des
connaissances pour la comprendre jusqu'au bout. C'est tout. Bien que ne
comprenant pas vraiment la condition 2, j'ai quand même la vague
impression qu'elle n'a pas sa place ici...
Merci beaucoup pour la réponse. :-)
Kobayashi a écrit :
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
Jusque là, cela correspond à ce que je pensais il me semble. Sauf que
moi, je m'étais arrêté à la condition 1. Et d'ailleurs...
condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
... je ne saisis pas trop ce que vient faire cette condition 2 qui a à
voir avec la classe C. Je ne vois pas trop le rapport. Pour moi, si le
comportement de __setattr__ n'a pas été changé dans le corps de la
classe C alors obj.__setattr__('x', <valeur>) devient obj.__dict__['x']
= <valeur> et c'est tout. Mais en réalité je n'ai aucune certitude.
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
D'accord.
Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
Bon là, je suis perdu, pas sur la logique (là dessus je suis) mais c'est
parce que je ne connais pas vraiment la notion de descripteur.
PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
Mais votre réponse est très logique au contraire. Il me manque des
connaissances pour la comprendre jusqu'au bout. C'est tout. Bien que ne
comprenant pas vraiment la condition 2, j'ai quand même la vague
impression qu'elle n'a pas sa place ici...
Merci beaucoup pour la réponse. :-)
Kobayashi a écrit :1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
où <valeur> est une expression quelconque et où l'on suppose que obj
est l'identifiant d'un objet (nouveau style), instance d'une classe C.
Je dirais que seul 2/ permet de "lier un attribut" à une
instance à coup sur. On récupérera alors la valeur de
l'attribut par "result = obj.__dict__['x']" car
"result = obj.x" est soumis au même conditions que ce
qui vas être dit dans la suite ...
Pour moi, 1/ est une façon équivalente mais
plus concise d'écrire 3/ de même que pour une
fonction f (ou tout autre objet "callable"),
l'écriture f() est équivalente mais plus
concise que f.__call__().
L'appel 1/ ou 3/ implique l'appel à 2/ si
condition1 et condition2 sont vérifiées avec:
condition1 : le comportement par défaut
de __setattr__ n'a pas été changé.
Jusque là, cela correspond à ce que je pensais il me semble. Sauf que
moi, je m'étais arrêté à la condition 1. Et d'ailleurs...condition2 : la classe C n'a pas d'attribut "x"
ou bien la classe C a un attribut "x" et
cet attribut n'est pas un descripteur
... je ne saisis pas trop ce que vient faire cette condition 2 qui a à
voir avec la classe C. Je ne vois pas trop le rapport. Pour moi, si le
comportement de __setattr__ n'a pas été changé dans le corps de la
classe C alors obj.__setattr__('x', <valeur>) devient obj.__dict__['x']
= <valeur> et c'est tout. Mais en réalité je n'ai aucune certitude.
Si la condition 1 n'est pas vraie i.e. si le
comportement de __setattr__ a été modifié, c'est
la nouvelle implémentation qui est appelée
D'accord.Si la condition 2 n'est pas satisfaite i.e. la
classe C a un descripteur correspondant à x
mais que condition 1 est vraie alors
1/ et 3/ sont équivalents à
getattr(obj.__class__, "x").__set__(obj, <valeur>)
Bon là, je suis perdu, pas sur la logique (là dessus je suis) mais c'est
parce que je ne connais pas vraiment la notion de descripteur.PS : Quand je pense que je m'étais dit que j'allais
essayer de répondre simplement ...
Mais votre réponse est très logique au contraire. Il me manque des
connaissances pour la comprendre jusqu'au bout. C'est tout. Bien que ne
comprenant pas vraiment la condition 2, j'ai quand même la vague
impression qu'elle n'a pas sa place ici...
Merci beaucoup pour la réponse. :-)
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
Bonjour à tous,
Je me permets de poster ce message car je me perds un peu dans les
différentes manières de lier un attribut d'un objet instance.
Pouvez-vous me dire quelles sont les éventuelles différences entre 1/,
2/ et 3/ ?
1/ obj.x = <valeur>
2/ obj.__dict__['x'] = <valeur>
3/ obj.__setattr__('x', <valeur>)
Pour un peu de lecture sur les descripteurs, j'ai beaucoup appris
avec http://www.cafepy.com/article/python_attributes_and_methods
et http://www.python.org/doc/newstyle onglet "How-To Guide for
Descriptors" semble très bien aussi.
Pour un peu de lecture sur les descripteurs, j'ai beaucoup appris
avec http://www.cafepy.com/article/python_attributes_and_methods
et http://www.python.org/doc/newstyle onglet "How-To Guide for
Descriptors" semble très bien aussi.
Pour un peu de lecture sur les descripteurs, j'ai beaucoup appris
avec http://www.cafepy.com/article/python_attributes_and_methods
et http://www.python.org/doc/newstyle onglet "How-To Guide for
Descriptors" semble très bien aussi.
Noter que 2/ seul autorise
Noter que 2/ seul autorise
Noter que 2/ seul autorise
Bonjour !Noter que 2/ seul autorise
Exact.
Et aussi, le 1/ ne sait pas traiter les caractères non ASCII (accents,
par exemple) :
bar.__dict__['noël']= '25 décembre'
print dir(bar)
print bar.noël
Bonjour !
Noter que 2/ seul autorise
Exact.
Et aussi, le 1/ ne sait pas traiter les caractères non ASCII (accents,
par exemple) :
bar.__dict__['noël']= '25 décembre'
print dir(bar)
print bar.noël
Bonjour !Noter que 2/ seul autorise
Exact.
Et aussi, le 1/ ne sait pas traiter les caractères non ASCII (accents,
par exemple) :
bar.__dict__['noël']= '25 décembre'
print dir(bar)
print bar.noël