{"id":969,"date":"2010-10-02T10:34:22","date_gmt":"2010-10-02T08:34:22","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=969"},"modified":"2010-10-02T10:34:22","modified_gmt":"2010-10-02T08:34:22","slug":"python-les-fonctions-sont-des-objets","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2010\/10\/python-les-fonctions-sont-des-objets\/","title":{"rendered":"Python: les fonctions sont des objets"},"content":{"rendered":"<p>En python, tout est objet. Ceci est valable aussi pour les fonctions. Une fonction en python est un objet et peut donc avoir des attributs.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">def<\/span>&nbsp;ma_fonction():\r\n&nbsp;&nbsp;<span class=\"reservedname\">pass<\/span>\r\n<\/pre>\n<p>Cette foncion simple qui ne fait rien, a par exemple un attribut <em>__name__<\/em>. La commande suivante affichera le nom de la fonction:<\/p>\n<pre class=\"codesource\">\r\n&gt;&gt;&gt;&nbsp;<span class=\"reservedname\">print<\/span>&nbsp;ma_fonction.__name__\r\nma_fonction\r\n<\/pre>\n<p>L&rsquo;utilisateur peut \u00e9galement d\u00e9finir ses propres attributs \u00e0 cette fonction:<\/p>\n<pre class=\"codesource\">\r\nma_fonction.description&nbsp;=&nbsp;<span class=\"quotedstring\">\"Une&nbsp;fonction&nbsp;qui&nbsp;ne&nbsp;fait&nbsp;rien\"<\/span>\r\n\r\n&gt;&gt;&gt;&nbsp;<span class=\"reservedname\">print<\/span>&nbsp;ma_fonction.description\r\nUne&nbsp;fonction&nbsp;qui&nbsp;ne&nbsp;fait&nbsp;rien\r\n<\/pre>\n<p>Les attributs sont stock\u00e9s dans un attribut de la fonction appel\u00e9 <em>__dict__<\/em> qui comme son nom l&rsquo;indique est un dictionnaire contenant seulement les attributs donn\u00e9s par l&rsquo;utilisateur. <em>__name__<\/em> ne s&rsquo;y retrouve pas par exemple:<\/p>\n<pre class=\"codesource\">\r\n&gt;&gt;&gt;&nbsp;ma_fonction.__dict__\r\n{<span class=\"quotedstring\">'description'<\/span>:&nbsp;<span class=\"quotedstring\">'Une&nbsp;fonction&nbsp;qui&nbsp;ne&nbsp;fait&nbsp;rien'<\/span>}\r\n<\/pre>\n<p>On peut aussi faire des choses un peu plus surprenantes:<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">class<\/span>&nbsp;MaClasse():\r\n&nbsp;&nbsp;<span class=\"reservedname\">def<\/span>&nbsp;ma_fonction(self):\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"reservedname\">print<\/span>&nbsp;<span class=\"quotedstring\">\"ma&nbsp;fonction&nbsp;est&nbsp;ex\u00e9cut\u00e9e\"<\/span>\r\n\r\n<span class=\"reservedname\">def<\/span>&nbsp;une_autre_fonction():\r\n&nbsp;&nbsp;<span class=\"reservedname\">print<\/span>&nbsp;<span class=\"quotedstring\">\"une&nbsp;autre&nbsp;fonction&nbsp;est&nbsp;ex\u00e9cut\u00e9e\"<\/span>\r\n\r\n&gt;&gt;&gt;&nbsp;c=&nbsp;MaClasse()\r\n&gt;&gt;&gt;&nbsp;c.ma_fonction()\r\nma&nbsp;fonction&nbsp;est&nbsp;ex\u00e9cut\u00e9e\r\n\r\n&gt;&gt;&gt;&nbsp;c.ma_fonction&nbsp;=&nbsp;une_autre_fonction\r\n&gt;&gt;&gt;&nbsp;c.ma_fonction()\r\nune&nbsp;autre&nbsp;fonction&nbsp;est&nbsp;ex\u00e9cut\u00e9e\r\n<\/pre>\n<p>Autrement dit, j&rsquo;ai remplac\u00e9 dans ma classe l&rsquo;objet ma_fonction par une_autre_fonction. Cela veut dire qu&rsquo;au runtime, c&rsquo;est \u00e0 dire pendant l&rsquo;ex\u00e9cution du programme, on peut dynamiquement modifier les fonctions. Vous noterez aussi qu&rsquo;ici, on a assign\u00e9 \u00e0 une m\u00e9thode de classe une fonction normale et ceci avec une aisance que seul python apporte.<br \/>\nA mon avis, ce n&rsquo;est pas \u00e0 utiliser trop souvent et m\u00eame sans doute \u00e0 \u00e9viter absolument sous peine de faire du d\u00e9buggage du programme un v\u00e9ritable cauchemar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En python, tout est objet. Ceci est valable aussi pour les fonctions. Une fonction en python est un objet et peut donc avoir des attributs. def&nbsp;ma_fonction(): &nbsp;&nbsp;pass Cette foncion simple qui ne fait rien, a par exemple un attribut __name__. La commande suivante affichera le nom de la fonction: &gt;&gt;&gt;&nbsp;print&nbsp;ma_fonction.__name__ ma_fonction L&rsquo;utilisateur peut \u00e9galement d\u00e9finir [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/969"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=969"}],"version-history":[{"count":3,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/969\/revisions"}],"predecessor-version":[{"id":972,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/969\/revisions\/972"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}