Comments on: Comprendre les décorateurs Python pas à pas (partie 2) http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/ Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 12:15:31 +0000 hourly 1 http://wordpress.org/?v=3.3.1 By: Syl http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-14970 Syl Thu, 17 Oct 2013 15:57:51 +0000 http://sametmax.com/?p=683#comment-14970 Merci pour ta réponse Sam. Mais tout est objet en python, donc dans ce cas, pourquoi j'ai une erreur en faisant: <code> a="nem" a.zobi="la mouche" AttributeError: 'str' object has no attribute 'zobi'</code> A la limite, 'str' est un type "spécial", je peux comprendre....mais avec une fonction perso: <code> def test(): if not test.count: test.count = 0 else: test.count += 1 print test.count AttributeError: 'function' object has no attribute 'count' </code> Dans l'exemple de ta réponse, je comprend très bien (bien que je na savais pas qu'on pouvait créer dynamiquement des attributs) car il s'agit d'une classe. Mais pour une fonction, je comprend pas....en fait, c'est la notion "d'attribut de fonction" qui me turlupine (quel joli mot!). Merci pour ta réponse Sam.

Mais tout est objet en python, donc dans ce cas, pourquoi j’ai une erreur en faisant:

a="nem"
a.zobi="la mouche"

AttributeError: 'str' object has no attribute 'zobi'

A la limite, ‘str’ est un type “spécial”, je peux comprendre….mais avec une fonction perso:

def test():
if not test.count: test.count = 0
else: test.count += 1
print test.count

AttributeError: 'function' object has no attribute 'count'

Dans l’exemple de ta réponse, je comprend très bien (bien que je na savais pas qu’on pouvait créer dynamiquement des attributs) car il s’agit d’une classe.

Mais pour une fonction, je comprend pas….en fait, c’est la notion “d’attribut de fonction” qui me turlupine (quel joli mot!).

]]>
By: Sam http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-14969 Sam Thu, 17 Oct 2013 15:19:10 +0000 http://sametmax.com/?p=683#comment-14969 <pre lang="python">Les attributs en Python peuvent être attribués dynamiquement sur n'importe quel objet : In [1]: class Test: ...: pass ...: In [2]: t = Test() In [3]: t.attribut = 'Syl' In [4]: t.attribut Out[4]: 'Syl'</pre> Les fonctions sont des objets en Python, donc ça marche. En fait, on ne déclare presque jamais des attributs en Python. Quand tu fais dans un <code>__init__</code> : <pre lang="python">self.attribut.</pre> Tu ne déclare pas ton attribut. <code>Self </code>est déjà une instance (celle de l'objet en cours), et donc tu ne fais qu'attacher dynamiquement un attribut à une instance.
Les attributs en Python peuvent être attribués dynamiquement sur n'importe quel objet :
 
In [1]: class Test:
   ...:     pass
   ...:
 
In [2]: t = Test()
 
In [3]: t.attribut = 'Syl'
 
In [4]: t.attribut
Out[4]: 'Syl'

Les fonctions sont des objets en Python, donc ça marche.

En fait, on ne déclare presque jamais des attributs en Python.

Quand tu fais dans un __init__ :

self.attribut.

Tu ne déclare pas ton attribut. Self est déjà une instance (celle de l’objet en cours), et donc tu ne fais qu’attacher dynamiquement un attribut à une instance.

]]>
By: Syl http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-14961 Syl Thu, 17 Oct 2013 13:55:22 +0000 http://sametmax.com/?p=683#comment-14961 Ah oui, et je me demandais aussi s'il existait une syntaxe en python qui permette de faire ça pour une exécution de fonction et pas sur une définition. Je m'explique....euh comment dire...ben...imagine le décorateur "benchmark", mais qui s'utiliserait comme le magic quote %timeit de ipython! ^^ Ce serait utile pour des script où on voudrait mesurer l'action de certaines actions sans avoir à placer des clock() partout...je sais pas si j'ai été clair! Ah oui, et je me demandais aussi s’il existait une syntaxe en python qui permette de faire ça pour une exécution de fonction et pas sur une définition.

Je m’explique….euh comment dire…ben…imagine le décorateur “benchmark”, mais qui s’utiliserait comme le magic quote %timeit de ipython! ^^

Ce serait utile pour des script où on voudrait mesurer l’action de certaines actions sans avoir à placer des clock() partout…je sais pas si j’ai été clair!

]]>
By: Syl http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-14960 Syl Thu, 17 Oct 2013 13:46:19 +0000 http://sametmax.com/?p=683#comment-14960 Je ne comprend pas comment tu peux faire ça dans la définition de ton wrapper: <code>wrapper.count = wrapper.count + 1</code> Comment peux-tu définir un attribut d'objet en dehors d'une classe? (sinon, merci pour l'article, comme d'hab, clair et utile!) Je ne comprend pas comment tu peux faire ça dans la définition de ton wrapper:
wrapper.count = wrapper.count + 1

Comment peux-tu définir un attribut d’objet en dehors d’une classe?

(sinon, merci pour l’article, comme d’hab, clair et utile!)

]]>
By: Sam http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-10828 Sam Fri, 12 Jul 2013 10:32:51 +0000 http://sametmax.com/?p=683#comment-10828 Bien vu la wayback machine. Je rajoute le lien. Bien vu la wayback machine. Je rajoute le lien.

]]>
By: Pickle http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-10826 Pickle Fri, 12 Jul 2013 08:38:59 +0000 http://sametmax.com/?p=683#comment-10826 Le dernier lien n'est pas disponible. Merci WayBack : <a href="http://web.archive.org/web/20101223001036/http://www.afpy.org/Members/gawel/python/python-decorators" rel="nofollow"> Autrement, très instructif comme article ! Le dernier lien n’est pas disponible. Merci WayBack :

Autrement, très instructif comme article !

]]>
By: Etienne http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-2973 Etienne Fri, 09 Nov 2012 18:55:10 +0000 http://sametmax.com/?p=683#comment-2973 Limpide! Limpide!

]]>
By: JeromeJ http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-2463 JeromeJ Sun, 14 Oct 2012 18:32:44 +0000 http://sametmax.com/?p=683#comment-2463 <span class="kamoulox"></span>"#reverse_string ('Karine alla en Irak',) {} #wrapper 0.0 #wrapper a été utilisée: 1x #ablE sanana snob port ed etrop bons anan aS" FAUX ! “#reverse_string (‘Karine alla en Irak’,) {}
#wrapper 0.0
#wrapper a été utilisée: 1x
#ablE sanana snob port ed etrop bons anan aS”

FAUX !

]]>
By: Sam http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-1467 Sam Mon, 20 Aug 2012 16:49:16 +0000 http://sametmax.com/?p=683#comment-1467 Bonjour @Takanuva, Je pourrais faire un article là dessus pour plus de détails, mais en résumé: - classmethod transforme la méthode en méthode de classe. On pas besoin d'instance pour éxécuter la méthode, et le premier paramètre est la classe elle même. On l'utilise pour le code commun à toutes les instances, et celles des classes enfants. - staticmethod transforme la méthode en méthode statique. On as pas besoin d'instance pour éxécuter la méthode, et aucun paramètre n'est passé automatiquement à la méthode. On l'utilise pour le code de type "outil", mais qui n'es pas particulièrement lié à la classe, pour des raisons d'encapsulation. - property transforme la méthode en propriété, c'est à dire que la méthode est déguisée pour ressembler à un attribut, mais l'accès à cet attribut (avec le signe "=") éxécute le code de la méthode. On l'utilise pour simplifier les APIs. Bonjour @Takanuva,

Je pourrais faire un article là dessus pour plus de détails, mais en résumé:

- classmethod transforme la méthode en méthode de classe. On pas besoin d’instance pour éxécuter la méthode, et le premier paramètre est la classe elle même. On l’utilise pour le code commun à toutes les instances, et celles des classes enfants.

- staticmethod transforme la méthode en méthode statique. On as pas besoin d’instance pour éxécuter la méthode, et aucun paramètre n’est passé automatiquement à la méthode. On l’utilise pour le code de type “outil”, mais qui n’es pas particulièrement lié à la classe, pour des raisons d’encapsulation.

- property transforme la méthode en propriété, c’est à dire que la méthode est déguisée pour ressembler à un attribut, mais l’accès à cet attribut (avec le signe “=”) éxécute le code de la méthode. On l’utilise pour simplifier les APIs.

]]>
By: Takanuva http://sametmax.com/comprendre-les-decorateur-python-pas-a-pas-partie-2/#comment-1461 Takanuva Mon, 20 Aug 2012 12:49:40 +0000 http://sametmax.com/?p=683#comment-1461 Bonjour, J'espère que malgré l'ancienneté du post vous lirez encore ce commentaire. Dans d'autre post vous utilisez le décorateur "classmethod" (http://0bin.net/paste/457d639ee5d0d954ff5efc3aa1c0fcfc22582ad1#YcymIc9cyRkeffQsn/j4vqKKYMW8zkO4pJkCLh9zQao=) ça sert à quoi? De même je ne connais pas les décorateurs "property" et "staticmethod", ils servent à quoi? merci Bonjour,
J’espère que malgré l’ancienneté du post vous lirez encore ce commentaire.
Dans d’autre post vous utilisez le décorateur “classmethod” (http://0bin.net/paste/457d639ee5d0d954ff5efc3aa1c0fcfc22582ad1#YcymIc9cyRkeffQsn/j4vqKKYMW8zkO4pJkCLh9zQao=) ça sert à quoi?
De même je ne connais pas les décorateurs “property” et “staticmethod”, ils servent à quoi?

merci

]]>