# articles

feed_id: http://sametmax.com/?p=3534
title: La différence entre __new__ et __init__ en Python
uri: La-différence-entre-__new__-et-__init__-en-Python
url: http://sametmax.com/la-difference-entre-__new__-et-__init__-en-python/
content:
<p>Les méthodes <code>__new__</code> et <code>__init__</code> n&#8217;ont rien de spécial. Ce sont des méthodes ordinaires. Mais parce qu&#8217;elles sont nommées ainsi, Python les détecte et les appelle automatiquement a un moment précis.</p>
<p>Ce moment, c&#8217;est ce qui différencie <code>__init__</code> de <code>__new__</code>.</p>
<h2><code>__init__</code> pour initialiser</h2>
<p><code>__init__</code> est la méthode qui va être appelée automatiquement après qu&#8217;un objet ai été crée. <strong>Ce n&#8217;est pas un contructeur du tout</strong>, c&#8217;est un initialiseur.</p>
<p>Si vous faîtes ça:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Premiere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...         
...         <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, prix<span style="color: black;">&#41;</span>:
...                 <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%s euros&quot;</span> <span style="color: #66cc66;">%</span> prix
...         
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c = Premiere<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">10000</span> euros</pre></div></div>

<p>A la ligne <code>c = Premiere(10000)</code>, Python va créer une instance de la classe <code>Première()</code>. Il va ensuite immédiatement et automatiquement appeler <code>__init__</code> en lui passant cette instance en premier argument et les paramètres passés par l&#8217;appel <code>Premiere(paramètres)</code>. Donc, quand <code>__init__</code> est appelé, l&#8217;objet instancié existe déjà.</p>
<p>On va utiliser <code>__init__</code> pour initialiser l&#8217;objet, c&#8217;est à dire pour lui donner son état de départ: changer les attributs, configurer l&#8217;objet par rapports aux arguments, etc.</p>
<p> Dans tous les autres langages, on utiliserait le constructeur pour faire ce boulot. Pas en Python. </p>
<p> L&#8217;avantage de <code>__init__</code>, c&#8217;est qu&#8217;il est très facile à manipuler. Il n&#8217;y a pas de magie dangereuse dans <code>__init__</code>: on a l&#8217;objet tout neuf, et les arguments passés à l&#8217;instancitation, on peut donc manipuler l&#8217;objet sans se soucier du reste. Ici on attache deux attributs à l&#8217;instance <code>self</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"> <span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Premiere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...         <span style="color: black;">discount</span> = <span style="color: #008000;">False</span>
...         <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, prix<span style="color: black;">&#41;</span>:
...                 <span style="color: #008000;">self</span>.<span style="color: black;">prix</span> = prix
...                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">prix</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">5000</span>:
...                     <span style="color: #008000;">self</span>.<span style="color: black;">discount</span> = <span style="color: #008000;">True</span>
...         
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c = Premiere<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c.<span style="color: black;">discount</span>
<span style="color: #008000;">False</span></pre></div></div>

<p>Comme en Python les attributs sont dynamiques, on peut attacher un argument même si l&#8217;instance ne le déclare pas, et il est créé automatiquement. </p>
<p>En résumé: <code>__init__</code> est appelé automatiquement APRES la création de l&#8217;objet, et on met dedans le code d&#8217;initialisation de l&#8217;objet (généralement une modification des attributs pour leur donner leur état de départ).</p>
<h2><code>__new__</code> pour créer</h2>
<p><code>__new__</code> est le vrai constructeur. Pour cette raison, elle doit retourner un objet.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Premiere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...
...     <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, prix<span style="color: black;">&#41;</span>:
...        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%s euros&quot;</span> <span style="color: #66cc66;">%</span> prix
...        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Premiere, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c = Premiere<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">10000</span> euros</pre></div></div>

<p><code>__new__</code> est appelée AVANT la création de l&#8217;objet, car c&#8217;est son boulot de créer l&#8217;instance et de la retourner. Comme on ne sait pas retourner une instance nous même (enfin si, mais pas dans cet article :-)), on appelle <code>super()</code> pour utiliser la méthode <code>__new__</code> de <code>object</code> et créer une instance pour cette classe.</p>
<p>L&#8217;objet créé sera ensuite passé à <code>__init__</code> automatiquement par Python.</p>
<p>On utilise rarement <code>__new__</code>. Les deux cas principaux sont:</p>
<ul>
<li>si on hérite d&#8217;un type immutable (str, int, tuple, etc), <code>__new__</code> est le seul endroit où on puisse initialiser l&#8217;objet.</li>
<li>dans le cas des métaclasses.</li>
</ul>
<p>En résumé: <code>__new__</code> est le vrai constructeur, il est appelé pour créer l&#8217;objet, et l&#8217;objet ainsi instancié est passé à <code>__init__</code>. Vous n&#8217;avez presque aucune raison de vous en servir, c&#8217;est vraiment pour les cas particuliers.</p>
<p>Voici l&#8217;ordre d&#8217;éxécution:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Premiere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...         <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, prix<span style="color: black;">&#41;</span>:
...                 <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;__new__&quot;</span>
...                 <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Premiere, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>
...         <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
...                 <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;__init__&quot;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c = Premiere<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>
<span style="color: #0000cd;">__new__</span>
<span style="color: #0000cd;">__init__</span></pre></div></div>

<h2>Exemple d&#8217;utilisation de <code>__new__</code></h2>
<p>Généralement on sait très bien utiliser <code>__init__</code>, mais <code>__new__</code> est moins évident.</p>
<p>L&#8217;usage le plus fréquent de <code>__new__</code> quand on hérite d&#8217;objets immutables. Par exemple, si vous voulez faire un objet <code>Temperature</code> qui hérite de <code>float</code> et qui accepte une unité en plus, ceci ne va pas marcher:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Temperature<span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value, unit<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Temperature, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">unit</span> = unit
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;%s%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">value</span>, <span style="color: #008000;">self</span>.<span style="color: black;">unit</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> Temperature<span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span>, <span style="color: #483d8b;">'°C'</span><span style="color: black;">&#41;</span>
&nbsp;
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-1-65b676255e09&gt;&quot;</span>, line <span style="color: #ff4500;">11</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    Temperature<span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span>, <span style="color: #483d8b;">'°C'</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">TypeError</span>: <span style="color: #008000;">float</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> takes at most <span style="color: #ff4500;">1</span> argument <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span> given<span style="color: black;">&#41;</span></pre></div></div>

<p>La raison est que du fait de la nature immutable de <code>float</code>, il est initialisé dans <code>__new__</code>, et il n&#8217;attend aucune valeur de plus dans <code>__new__</code>, mais on lui passe malgré tout (via <code>Temperature(10, '°C')</code>).</p>
<p>En revanche, ceci va marcher:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Temperature<span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, value, unit<span style="color: black;">&#41;</span>:
&nbsp;
        instance = <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Temperature, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, value<span style="color: black;">&#41;</span>
        instance.<span style="color: black;">unit</span> = unit
        <span style="color: #ff7700;font-weight:bold;">return</span> instance
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;%s%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Temperature, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">unit</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> Temperature<span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span>, <span style="color: #483d8b;">'°C'</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">10.0</span>°C</pre></div></div>

<p>Comme on override <code>__new__</code>, on lui donne la possibilité d&#8217;accepter une argument de plus.</p>
<p>Un autre exemple serait de vouloir créer une chaîne de caractères qui est toujours en majuscule (ce qui est bien moins utile que l&#8217;exemple précédent):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> CapsLockString<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> value <span style="color: #808080; font-style: italic;"># et maintenant je fais quoi ?</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> CapsLockString<span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">test</span>
<span style="color: #dc143c;">test</span></pre></div></div>

<p>Ça ne plantera pas, mais il n&#8217;y a rien que nous puissions faire car <code>str</code> est immutable. On ne peut tout simplement pas faire quoique ce soit avec <code>value</code>. Avec <code>__new__</code>, on peut faire quelque chose sur la chaîne intermédiaire:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> CapsLockString<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, value<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>CapsLockString, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, value.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> CapsLockString<span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span><span style="color: black;">&#41;</span>
TEST</pre></div></div>

<p>Deux chaînes sont en fait créées, une normale, puis une en majuscule retournée par upper() qui va servir de valeur à notre objet (en fait il y en a même 3 dans l&#8217;implémentation CPython, c&#8217;est pour ça que les notations littérales sont plus rapides que l&#8217;usage des classes pour créer des built-in).</p>
<p><code>__new__</code> permet donc essentiellement de créer de jolis API. On l&#8217;utilise par ailleurs dans les metaclasses, mais ce sera pour un autre article.</p>
<p>Un troisième usage de<code> __new__</code>, assez rare (mais en même temps utiliser <code>__new__</code> est déjà rare), c&#8217;est le pattern factory. Les javaistes le connaissent bien, c&#8217;est un motif de conception qui permet de gérer la création d&#8217;objets qui peuvent eux même créer des objets, qui créer des objets qui&#8230; Bref.</p>
<p>Car en fait <code>__new__</code> peut retourner n&#8217;importe quoi. Il peut <a href="http://sametmax.com/usages-et-dangers-du-null-object-pattern-en-python/">retourner toujours la même instance</a> pour faire un singleton par exemple. On peut même carrément renvoyer un truc qui n&#8217;a rien n&#8217;a voir, par exemple une fonction :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> FonctionFactory<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value, repeat<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> repeater<span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>=value<span style="color: black;">&#41;</span>:
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">string</span> <span style="color: #66cc66;">*</span> repeat
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> repeater
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> function = FonctionFactory<span style="color: black;">&#40;</span><span style="color: #483d8b;">'hello'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># création de la fonction</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> function<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
hellohello
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'bonjour'</span><span style="color: black;">&#41;</span>
bonjourbonjour</pre></div></div>

<p>Ici on retourne carrément une fonction, et pas du tout une instance de <code>FonctionFactory()</code> comme prévu. On pourrait faire ceci de manière plus simple avec de la programmation fonctionnelle, mais <code>__new__</code> permet de bénéficier de tout l&#8217;outillage de la POO.</p>


feed_id: http://sametmax.com/?p=4102
title: Le module operator en Python
uri: Le-module-operator-en-Python
url: http://sametmax.com/le-module-operator-en-python/
content:
<p>Le module <code>operator</code> contient des fonctions qui font ce que font les opérateurs. Exemple :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> add, gt
<span style="color: #66cc66;">&gt;&gt;&gt;</span> add<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># fait en fonction ce que ferait 1 + 1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gt<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># fait en fonction ce que ferait 1 &gt; 2</span></pre></div></div>

<p>On a donc dans le module <code>operator</code> de quoi remplacer les opérateurs <code>+</code>, <code><</code>, <code>not</code>, etc. par des fonctions.</p>
<p>Les opérateurs <code>or</code> et <code>and</code> n'ont pas de fonctions équivalentes car ils short circuitent, ce que ne peut pas faire une fonction. <code>operator.and_</code> et <code>operator.or_</code> sont des fonctions pour <code>&#038;</code> et <code>|</code>, par pour <code>or</code> et <code>and</code>.</p>
<p>Il y a des opérateurs qu'on oublie souvent, comme l'opérateur <code>[]</code>. Le module <code>operator</code> contient des fonctions pour lui également.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> getitem, getslice
<span style="color: #66cc66;">&gt;&gt;&gt;</span> lst = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> lst<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
<span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getitem<span style="color: black;">&#40;</span>lst, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> lst<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getslice<span style="color: black;">&#40;</span>lst, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span></pre></div></div>

<p>On oublie parfois l'opérateur ".". Il y a une fonction builtin pour ça:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Classe<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...     <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">type</span><span style="color: black;">&#41;</span>:
...         <span style="color: #008000;">self</span>.<span style="color: #008000;">type</span> = <span style="color: #008000;">type</span>
...         
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c = Classe<span style="color: black;">&#40;</span><span style="color: #483d8b;">'cm2'</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> c.<span style="color: #008000;">type</span>
<span style="color: #483d8b;">'cm2'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>c, <span style="color: #483d8b;">'type'</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'cm2'</span></pre></div></div>

<p>Mais le plus étonnant dans le module <code>operator</code>, c'est qu'il a des fonctions qui retournent... des fonctions.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> itemgetter
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getfirst = itemgetter<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getfirst<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getfirst<span style="color: black;">&#40;</span><span style="color: #483d8b;">'abc'</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'a'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getsecond = itemgetter<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getsecond<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">2</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getsecond<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;abc&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'b'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getlast = itemgetter<span style="color: black;">&#40;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getlast<span style="color: black;">&#40;</span><span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">99</span></pre></div></div>

<p>Ici on créer des fonctions qui ont pour seul triste but dans la vie de retourner l'élément à l'index donné. <code>getfirst</code> retournera l'élément <code>0</code>. <code>getsecond</code> retournera l'élément à l'index <code>1</code>. <code>getlast</code> retournera l'élément à l'index <code>-1</code>. <code>itemgetter(</code>) est un créateur de fonction qui ne font que ça: retourner un seul élément.</p>
<p>On pourrait aussi le faire avec une <a href="http://sametmax.com/fonctions-anonymes-en-python-ou-lambda/">lambda</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> getfirst = <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> getfirst<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">1</span></pre></div></div>

<p>On a le même chose de chose pour les attributs. <code>attrgetter</code> est une fonction qui crée une fonction. La fonction créée retourne toujour la valeur du même attribut.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> attrgetter
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gettype = attrgetter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'type'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># crée une fonction qui ...</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gettype<span style="color: black;">&#40;</span>Classe<span style="color: black;">&#40;</span><span style="color: #483d8b;">'cm2'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># ... retourne la valeur de l'attribut 'type'</span>
<span style="color: #483d8b;">'cm2'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gettype<span style="color: black;">&#40;</span>Classe<span style="color: black;">&#40;</span><span style="color: #483d8b;">'6eme'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'6eme'</span></pre></div></div>

<p>On pourrait aussi le faire avec une <code>lambda</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> gettype = <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x.<span style="color: #008000;">type</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gettype<span style="color: black;">&#40;</span>Classe<span style="color: black;">&#40;</span><span style="color: #483d8b;">'6eme'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'6eme'</span></pre></div></div>

<p>Ces fonctions n'ont pas l'air utile comme ça, mais en Python les fonctions peuvent être passées en paramètres. Cela permet donc de faire des choses intéressante comme de <a href="http://sametmax.com/quest-ce-quun-callback/">l'injection de dépendance</a>. C'est notamment ainsi que fonctionne <code>key</code> dans <a href="http://docs.python.org/2/library/functions.html?highlight=sorted#sorted">sorted()</a>.</p>
<p>Bref, jetez un coup d'oeil à operator, il est plein comme un oeuf:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">&lt;</span>tab<span style="color: #66cc66;">&gt;</span>
<span style="color: #008000;">abs</span>               delitem           getslice          ilshift           ior               isSequenceType    le                neg               sequenceIncludes
add               delslice          gt                imod              ipow              is_               lshift            not_              setitem
and_              div               iadd              imul              irepeat           is_not            lt                or_               setslice
attrgetter        eq                iand              index             irshift           isub              methodcaller      pos               sub
concat            floordiv          iconcat           indexOf           isCallable        itemgetter        mod               <span style="color: #008000;">pow</span>               truediv
contains          ge                idiv              inv               isMappingType     itruediv          mul               repeat            truth
countOf           getitem           ifloordiv         invert            isNumberType      ixor              ne                rshift            xor</pre></div></div>


feed_id: http://sametmax.com/?p=4112
title: Configurer votre terminal pour qu’il vous notifie de la fin d’une commande longue
uri: Configurer-votre-terminal-pour-qu-il-vous-notifie-de-la-fin-d-une
url:
http://sametmax.com/configurer-votre-terminal-pour-quil-vous-notifie-de-la-fin-dune-commande-longue/

content:
<p><a href="http://mumak.net/undistract-me/">UndistractMe</a>: un petit software que je n&#8217;ai testé que sous Ubuntu (donc je ne sais pas si ça marche ailleurs, ni comment l&#8217;installer) qui vous envoit une notification quand une commande qui met plus de 10 secondes à tourner prend fin.</p>
<div id="attachment_4114" class="wp-caption aligncenter" style="width: 486px"><a href="http://sametmax.com/wp-content/uploads/2013/01/Espace-de-travail-1_021.jpg"><img class=" wp-image-4114 " title="Dumb ways to die, so many dum ways to die !" src="http://sametmax.com/wp-content/uploads/2013/01/Espace-de-travail-1_021.jpg" alt="Capture d'écran de undistract-me" width="476" height="127" /></a><p class="wp-caption-text">Dumb ways to die, so many dum ways to die !</p></div>
<p>Très pratique quand on lance une installe ou des tests unitaires. </p>
<p>Pour l&#8217;installer:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> add-apt-repository ppa:undistract-me-packagers<span style="color: #000000; font-weight: bold;">/</span>daily
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> update
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> undistract-me</pre></div></div>

<p>Et ensuite rajouter dans son <em>.bashrc</em>:<br />
<code><br />
notify_when_long_running_commands_finish_install</code></p>
<p>Pour que ça fonctionne il faut aussi activer &#8220;Executer les commandes comme shell de connexion&#8221; dans les options de votre terminal. Par exemple pour <a href="http://guake.org/">Guake</a>:</p>
<div id="attachment_4115" class="wp-caption aligncenter" style="width: 404px"><a href="http://sametmax.com/wp-content/uploads/2013/01/Espace-de-travail-1_022.jpg"><img class=" wp-image-4115 " title="C'est à peu prêt la même chose pour Gnome Terminal" src="http://sametmax.com/wp-content/uploads/2013/01/Espace-de-travail-1_022.jpg" alt="Capture d'écran des options de Guake" width="394" height="392" /></a><p class="wp-caption-text">C&#39;est à peu prêt la même chose pour Gnome Terminal</p></div>
<p>Modifiez la variable <code>LONG_RUNNING_COMMAND_TIMEOUT</code> dans <em>/usr/share/undistract-me/long-running.bash</em> si 10 secondes vous parait trop long ou trop court.</p>


feed_id: http://sametmax.com/?p=4120
title: Testez vos Webapp sur iPhone / iPad avec le Simulator iOS – [Mac]
uri: Testez-vos-Webapp-sur-iPhone-iPad-avec-le-Simulator-iOS-Mac
url: http://sametmax.com/testez-vos-webapp-sur-iphone-ipad-avec-le-simulator-ios-mac/
content:
<p>La plupart d&#8217;entre vous le savent certainement mais moi je viens de le découvrir :)</p>
<p>Au début j&#8217;utilisais <a href="https://chrome.google.com/webstore/detail/ripple-emulator-beta/geelfhphabnejjhdalkjhgipohgpdnoc">Ripple</a> mais ce n&#8217;est pas de l&#8217;émulation, juste de l&#8217;encapsulage donc pas top.</p>
<p>Hier un pote me parle d&#8217;iOs Simulator , un émulateur iPhone / iPad livré avec Xcode. J&#8217;ai été surpris par la qualité de l&#8217;outil, un petit executable de 5 Mo qui émule très bien l&#8217;iPhone, l&#8217;iphone Retina ainsi que l&#8217;iPad.</p>
<p>Pour se le procurer c&#8217;est un peu galère, il faut télécharger Xcode (4GB!) dans le dev center, avoir un compte dev donc. <a href="https://developer.apple.com/xcode/">ça se passe ici</a> . C&#8217;est pas la mort mais y a plus simple&#8230;</p>
<p>Pour le trouver une fois installé..CHERCHEZ ! De tous les sites que j&#8217;ai parcouru aucun n&#8217;avait le même emplacement que moi, les dev de chez apple adorent faire des blagues. ça va donc dépendre de votre version de Xcode, de votre OS, du temps qu&#8217;il fait.<br />
Un indice quand même c&#8217;est dans un des sous répertoires <strong><em>/Developer/</em> </strong>.<br />
Moi il est dans <em>/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications</em> et il se nomme &#8220;Simulateur iOS&#8221;</p>
<div id="attachment_4123" class="wp-caption aligncenter" style="width: 545px"><img class=" wp-image-4123  " title="iOS Simulator" src="http://sametmax.com/wp-content/uploads/2013/01/ios_simulator.png" alt="" width="535" height="478" /><p class="wp-caption-text">Pratique pour tester ses webapps sur iPhone / iPad</p></div>
<p>L&#8217;utilisation est nickel et j&#8217;ai pu corriger quelques bugs que je n&#8217;avais pas sur Ripple sous chrome ou même sous Safari. Ceci dit d&#8217;après un autre pote qui lui bosse en tant que dev sur les machines apple, rien ne vaut un appareil original, même avec l&#8217;émulateur il peut y avoir des problèmes.</p>
<p>Android a lui aussi un émulateur dans son <a href="http://developer.android.com/sdk/index.html">SDK téléchargeable ici</a></p>
<p>Pour le lancer c&#8217;est un peu plus <del datetime="2013-01-13T14:21:57+00:00">compliqué</del> long car il faut configurer un appareil.</p>
<p>Une fois le SDK téléchargé, allez dans le répertoire <em>adt-bundle-mac-x86_64/sdk/tools</em> et lancez la commande <strong><em>./android avd</em></strong> qui va avoir pour but de lancer le manager d&#8217;appareils, depuis ce manager vous allez pouvoir créer un nouvel appareil si il n&#8217;y en a pas déjà et le lancer (bouton &#8220;start&#8221;).</p>


feed_id: http://sametmax.com/?p=4134
uri: Le-guide-ultime-et-définitif-sur-la-programmation-orientée-objet-en
title:
Le guide ultime et définitif sur la programmation orientée objet en Python à l’usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 1.

url:
http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-1/

content:
<p>Prérequis à ce tuto bien chargé :</p>
<ul>
<li>comprendre parfaitement les mots clés les plus courants (conditions, tests, pass, etc);</li>
<li>comprendre parfaitement les fonctions (et donc les <a href="http://sametmax.com/operateur-splat-ou-etoile-en-python/">paramètres avancées</a> en Python);</li>
<li>comprendre la notion de <a href="http://sametmax.com/valeurs-et-references-en-python/">référence</a>;</li>
<li>connaitre les <a href="http://sametmax.com/quest-ce-quune-structure-de-donnees/">structures de données</a> de base (string, int, list, dict, etc).</li>
</ul>
<h2>Intro</h2>
<p>Il y a des tas de manières de programmer. Des styles. Des formes que l&#8217;on donne au code. On leur donne des noms: programmation procédurale, fonctionnelle, orientée flux, par contrat, etc. C&#8217;est ce qu&#8217;on appelle des paradigmes, des points de vue sur comment on doit faire le boulot.</p>
<p>En vérité, le point de vue n&#8217;est pas déterminant. Vous pouvez faire le même boulot en utilisant n&#8217;importe lequel. L&#8217;important c&#8217;est de coder.</p>
<p>Mais chaque point de vue possède des caractéristiques et des outils différents. </p>
<p>Ce que vous allez voir est ce qu&#8217;on appelle la programmation orientée objet, ou POO. C&#8217;est un simple point de vue, un outil, mais il est très utilisé en Python, Ruby ou Java.</p>
<p>Quand vous avez appris la programmation, on vous a montré comment stocker des données dans des structures de données:</p>
<ul>
<li>les listes</li>
<li>les chaînes</li>
<li>les entiers</li>
<li>les dictionnaires</li>
<li>etc</li>
</ul>
<p>Et on vous a montré comment créer un comportement pour votre programme en utilisant des mots clés, puis plus tard en utilisant des fonctions pour regrouper ces mots clés. </p>
<p>En Python, à ce stade, vous utilisez des fonctions pour agir sur des structures de données.</p>
<p><strong>La programmation orienté objet, c&#8217;est un style de programmation qui permet de regrouper au même endroit le comportement (les fonctions) et les données (les structures) qui sont faites pour aller ensemble.</strong></p>
<p>C&#8217;est tout. C&#8217;est une simple question d&#8217;organisation du programme.</p>
<h2>Qu&#8217;est-ce qu&#8217;un objet</h2>
<p>Un objet est un&#8230; truc. Un machin. Un bidule.</p>
<p>Ça peut vous paraître une définition floue, mais c&#8217;est parce que c&#8217;est exactement ce que peut être un objet: n&#8217;importe quoi que vous décidiez de coder. L&#8217;objet est un moyen de dire à la machine, ce < entrez_ici_un_nom_de_truc > possède telle donnée, et fait telle chose avec.</p>
<p>En Python, absolument tout est un objet : une chaîne, un entier, un dictionnaire, une liste, une fonction&#8230; Vous avez donc manipulé des objets sans le savoir. Maintenant vous allez créer les votre.</p>
<p>Créer des objets se fait en deux étapes: décrire à quoi ressemble votre objet, et demander à l&#8217;ordinateur d&#8217;utiliser cette description pour le fabriquer.</p>
<p>En Python 2.x, cela donne ceci:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> object_tout_neuf = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> object_tout_neuf
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x3112440<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>La description de l&#8217;objet (le plan de construction) est :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>C&#8217;est ce qu&#8217;on appelle une classe. La classe est le moyen, en Python, de décrire à quoi va ressembler un objet.</p>
<p>On dit ici:</p>
<p>&#8220;Cet objet s&#8217;appelle DescriptionDeLObject.&#8221;</p>
<p>C&#8217;est tout.</p>
<p>Ensuite, on crée l&#8217;objet:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> object_tout_neuf = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><code>DescriptionDeLObject()</code> (notez les parenthèses), est la syntaxe Python pour dire &#8220;fabrique un objet à partir de ce plan&#8221;. Le nouvel objet va être retourné, et mis dans la variable <code>object_tout_neuf</code>.</p>
<p>La variable <code>object_tout_neuf</code> contient un objet issue de la classe <code>DescriptionDeLObject</code>, on dit qu&#8217;il contient une instance de <code>DescriptionDeLObject</code>. C&#8217;est pour cela que l&#8217;action de créer un objet à partir d&#8217;une classe est appelée <em>instanciation</em>.</p>
<p>Python ne sait pas grand chose sur cet objet si ce n&#8217;est son nom et son adresse en mémoire. Si on fait <code>print</code> dessus, c&#8217;est donc ce qu&#8217;il vous donne:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> object_tout_neuf
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x3112440<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>On peut créer autant d&#8217;objets que l&#8217;on veut à partir d&#8217;une classe :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x31c1d40<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x31d6cf8<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x31d6bd8<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x31d6c68<span style="color: #66cc66;">&gt;</span></pre></div></div>

<h2>Méthodes</h2>
<p>Les méthodes sont des fonctions déclarées à l&#8217;intérieur de la classe. <em>Methode</em> est juste un nom pour dire &#8220;cette fonction est dans une classe&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> la_methode<span style="color: black;">&#40;</span>objet_en_cours<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Edgar Morin'</span></pre></div></div>

<p>Nous avons créer une &#8220;fonction&#8221; nommée <code>une_methode</code> dans le bloc de la classe. Puisqu&#8217;elle est dans ce bloc, cette fonction est ce qu&#8217;on appelle une méthode.</p>
<p>Elle n&#8217;existe pas en dehors de la classe.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> la_methode<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-12-c02691e8aa46&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    la_methode<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">NameError</span>: name <span style="color: #483d8b;">'la_methode'</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> defined</pre></div></div>

<p>Mais, elle est attachée à chaque objet. On peut l&#8217;utiliser en faisant < variable_contenant_objet >.< nom_de_méthode >. Ainsi, pour appeler la méthode une méthode, il nous faut forcément une instance :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> objet_tout_neuf = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> objet_tout_neuf.<span style="color: black;">la_methode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Edgar Morin</pre></div></div>

<p>Arrivé à ce stade, vous devez vous demander &#8220;quel est ce <code>objet_en_cours</code>&#8221; qui est défini comme paramètre de la méthode ?</p>
<p>C&#8217;est une spécificité de Python : quand vous appelez une méthode depuis un objet, l&#8217;objet est automatiquement passé en premier paramètre par Python. C&#8217;est automatique, et invisible.</p>
<p>C&#8217;est très facile à comprendre en faisant une méthode qui retourne <code>objet_en_cours</code> pour voir ce qu&#8217;il y a dedans :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
...         
...         <span style="color: #ff7700;font-weight:bold;">def</span> une_methode<span style="color: black;">&#40;</span>objet_en_cours<span style="color: black;">&#41;</span>:
...         
...                 <span style="color: #ff7700;font-weight:bold;">return</span> objet_en_cours
...     
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> ze_object 
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x3429170<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> ze_object.<span style="color: black;">une_methode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">DescriptionDeLObject</span> instance at 0x3429170<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>Python fait comme si on avait fait :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ze_object.<span style="color: black;">une_methode</span><span style="color: black;">&#40;</span>ze_object<span style="color: black;">&#41;</span></pre></div></div>

<p><code>objet_en_cours</code> et <code>ze_object</code> contiennent la même chose : l&#8217;objet en cours. <code>objet_en_cours</code> est juste le nom que nous avons donné à notre premier argument, mais Python passe toujours automatiquement en premier argument l&#8217;objet en cours afin que vous puissiez modifier cet objet à l&#8217;intérieur d&#8217;une méthode.</p>
<p>On dit donc que <code>objet_en_cours</code> est l&#8217;instance courante.</p>
<p>Une méthode doit donc toujours déclarer au moins un paramètre pour accueillir la référence à l&#8217;objet en cours, sinon ça plante. Voyez plutôt :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> methode_sans_objet_en_cours<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;test&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> methode_avec_objet_en_cours<span style="color: black;">&#40;</span>objet_en_cours<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;test&quot;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">methode_avec_objet_en_cours</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> 
<span style="color: #dc143c;">test</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">methode_sans_objet_en_cours</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-19-90434b7e7bfa&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    ze_object.<span style="color: black;">methode_sans_objet_en_cours</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">TypeError</span>: methode_sans_objet_en_cours<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> takes no arguments <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span> given<span style="color: black;">&#41;</span></pre></div></div>

<p>Python dit que <code>methode_sans_objet_en_cours</code> est déclarée sans argument mais on lui en a passé un tout de même. Et en effet, Python lui a passé de manière invisible l&#8217;objet en cours en tant que premier argument. </p>
<p>En résumé, on déclare une classe avec une méthode ainsi:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> nom_de_methode<span style="color: black;">&#40;</span>objet_en_cours<span style="color: black;">&#41;</span>:
&nbsp;
        faire quelque chose ici</pre></div></div>

<p>Et on l&#8217;utilise ainsi:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">variable = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
variable.<span style="color: black;">nom_de_methode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>Conventions</h2>
<p>En Python, peu de choses sont forcées. La plupart de choses sont des conventions. Mais ce sont des conventions fortes, les gens y tiennent.</p>
<p>Parmi ces conventions, il y a les conventions de nommage, à savoir:</p>
<ul>
<li>
on nomme les classes sans espace, avec des majuscules : NomDUneClasse</li>
<li>
on nomme le reste en minuscule avec des underscores : nom_de_methode, nom_d_attribut, etc</li>
</ul>
<p>La convention la plus surprenant est celle du premier paramètre des méthodes qui contient l&#8217;objet en cours. Son nom n&#8217;est pas forcé, contrairement aux autres langages (comme <code>this</code> en Java par exemple), en fait c&#8217;est un paramètre tout à faire ordinaire. Néanmoins, la (très très forte) convention est de l&#8217;appeler <code>self</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> nom_de_methode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        faire quelque chose ici</pre></div></div>

<p>Appelez-donc TOUJOURS le premier paramètre de chaque méthode <code>self</code>, et rappelez-vous qu&#8217;il contiendra toujours l&#8217;instance courante.</p>
<p>Enfin, les concepteurs de Python ont ajouté une convention supplémentaire : les méthodes appelées automatiquement sont appelées <code>__nom_de_methode__</code> (avec deux underscores de chaque côté).</p>
<p>En effet, il existe un certains nombre de méthodes que vous pouvez écrire, et si vous les nommez d&#8217;une certaine façon, elle seront appelées automatiquement quand une condition spéciale (liée au nom), se présente.</p>
<p>Nous verrons cela avec la méthode <code>__init__</code>.</p>
<h2>Attributs</h2>
<p>Vous avez vu que les méthodes étaient juste des fonctions attachées à un objet. Et bien les attributs sont juste des variables attachés à un objet.</p>
<p>En fait, techniquement, les méthodes sont aussi des attributs, mais faisons comme si ce n&#8217;était pas le cas et séparons :</p>
<ul>
<li>méthodes : fonctions pour objets</li>
<li>attributs : variables pour objets</li>
</ul>
<p>Comme Python est un langage dynamique, on peut ajouter n&#8217;importe quel attribut à n&#8217;importe quel objet en utilisant la syntaxe < objet >.< nom_attribut > :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> ze_object.<span style="color: black;">un_attribut</span> <span style="color: #808080; font-style: italic;"># l'attribut n'existe pas</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-30-b52a599929f9&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    ze_object.<span style="color: black;">un_attribut</span>
<span style="color: #008000;">AttributeError</span>: DescriptionDeLObject instance has no attribute <span style="color: #483d8b;">'un_attribut'</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">un_attribut</span> = <span style="color: #483d8b;">&quot;valeur de l'attribut&quot;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> ze_object.<span style="color: black;">un_attribut</span>
valeur de l<span style="color: #483d8b;">'attribut</span></pre></div></div>

<p>Et c&#8217;est là que vous allez voir l&#8217;interêt de <code>self</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> afficher<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># self est l'objet en cours, donc on à accès à ses attributs !</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> modifier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># on peut modifier les attributs depuis l'intérieur</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span> = <span style="color: #483d8b;">&quot;autre valeur&quot;</span></pre></div></div>

<p>On peut accéder aux attributs depuis l&#8217;intérieur et l&#8217;extérieur d&#8217;un objet :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">afficher</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># l'attribut n'existe pas encore</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-35-c10abd45fc98&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    ze_object.<span style="color: black;">afficher</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># l'attribut n'exite pas</span>
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-33-3e1eb4d8e5f6&gt;&quot;</span>, line <span style="color: #ff4500;">5</span>, <span style="color: #ff7700;font-weight:bold;">in</span> afficher
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span>
<span style="color: #008000;">AttributeError</span>: DescriptionDeLObject instance has no attribute <span style="color: #483d8b;">'un_attribut'</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">un_attribut</span> = <span style="color: #483d8b;">&quot;maintenant il existe !&quot;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">afficher</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> 
maintenant il existe <span style="color: #66cc66;">!</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">modifier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># l'attribut est modifié par la méthode</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">un_attribut</span> 
<span style="color: #483d8b;">'autre valeur'</span></pre></div></div>

<p>Comme une méthode est juste une fonction attachée à un objet, on peut lui passer des paramètres. Et une méthode a accès à l&#8217;objet en cours, elle peut modifier l&#8217;objet en cours. </p>
<p>Donc, une méthode peut modifier l&#8217;objet en cours en fonction des paramètres passés :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> afficher<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;La valeur actuelle est %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> modifier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, valeur<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span> = valeur <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">un_attribut</span> = <span style="color: #ff4500;">1</span> <span style="color: #808080; font-style: italic;"># on met un entier en valeur cette fois</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">afficher</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
La valeur actuelle est <span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">modifier</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># on passe un paramètre </span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object.<span style="color: black;">afficher</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
La valeur actuelle est <span style="color: #ff4500;">4</span></pre></div></div>

<p>Les méthodes servent exactement à cela : retourner les valeurs à l&#8217;intérieur de l&#8217;objet, ou à les modifier.</p>
<h2>Initialisation d&#8217;un objet</h2>
<p>On souhaite généralement donner une état de départ à tout nouvel objet créé. Par exemple, si vous travaillez sur un jeu vidéo de course de voiture, vous voudrez peut-être créer un objet voiture avec du carburant et une couleur de peinture. </p>
<p>Il serait contre productif de devoir les spécifier à chaque fois. Pour automatiser le travail, Python met à disposition des méthodes appelées automatiquement quand une condition est remplie. Ce sont les méthodes nommées <code>__methode__</code>.</p>
<p>Dans notre cas, on veut que notre objet ait un état de départ, donc on va utiliser la méthode qui est appelée automatiquement après la création de l&#8217;objet. C&#8217;est la méthode <code>__init__</code>.</p>
<p>Si vous appelez une méthode avec le nom <code>__init__</code>, Python va automatiquement, et de manière invisible, appeler la méthode après avoir créé l&#8217;objet :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> DescriptionDeLObject:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;L'objet a été créé !&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;La méthode est appelée automatiquement&quot;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object = DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
L<span style="color: #483d8b;">'objet a été créé !
La méthode est appelée automatiquement</span></pre></div></div>

<p><code>__init__</code> est une méthode tout à fait ordinaire. Seul le nom est important: comme elle est appelée ainsi, Python l&#8217;a détecte automatiquement et l&#8217;appelle au bon moment.</p>
<p>C&#8217;est très utile pour fournir un état de départ:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Voiture:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> = <span style="color: #ff4500;">100</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> = <span style="color: #483d8b;">&quot;noire&quot;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v = Voiture<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v.<span style="color: black;">couleur</span>
<span style="color: #483d8b;">'noire'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v.<span style="color: black;">carburant</span>
<span style="color: #ff4500;">100</span></pre></div></div>

<p>Bien entendu, on veut généralement pourvoir changer l&#8217;état de départ. Ici encore, Python nous aide:<strong> si vous passez des paramètres à l&#8217;instanciation, ils sont passés automatiquement à <code>__init__</code></strong>.</p>
<p>Comme <code>__init__</code> est une méthode ordinaire (et donc une fonction), on peut lui donner des paramètres avec des valeurs par défaut mais accepter une nouvelle valeur si elle est passée :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Voiture:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, combien_de_carburant=<span style="color: #ff4500;">100</span>, quelle_couleur=<span style="color: #483d8b;">&quot;noire&quot;</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> = combien_de_carburant
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> = quelle_couleur
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v1 = Voiture<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># sans paramètres, les valeurs par défaut sont utilisées</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v1.<span style="color: black;">couleur</span>
<span style="color: #483d8b;">'noire'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v1.<span style="color: black;">carburant</span>
<span style="color: #ff4500;">100</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v2 = Voiture<span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span>, <span style="color: #483d8b;">'rouge et jaune à petit pois'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># on change les valeurs</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v2.<span style="color: black;">couleur</span> 
<span style="color: #483d8b;">'rouge et jaune <span style="color: #000099; font-weight: bold;">\x</span>c3<span style="color: #000099; font-weight: bold;">\x</span>a0 petit pois'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v1.<span style="color: black;">couleur</span>
<span style="color: #483d8b;">'noire'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v3 = Voiture<span style="color: black;">&#40;</span>quelle_couleur=<span style="color: #483d8b;">&quot;fushia virant sur l'aigue marine&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v3.<span style="color: black;">couleur</span>
<span style="color: #483d8b;">&quot;fushia virant sur l'aigue marine&quot;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v3.<span style="color: black;">carburant</span>
<span style="color: #ff4500;">100</span></pre></div></div>

<p>Les valeurs passées dans <code>Voiture(valeurs, passées)</code>, sont automatiquement repassées à <code>__init__</code>(self, valeurs, passées). </p>
<p>En résumé : <code>__init__</code> est appelé automatiquement après que l&#8217;objet soit créé, et on lui passe les paramètres passées à l&#8217;instanciation. Comme <code>__init__</code> est une méthode et a accès à l&#8217;instance en courante, elle peut ajouter des attributs à l&#8217;objet en cours en fonction de ces paramètres. On utilise ça pour créer des objets avec un état de départ par défaut, et permettre une personnalisation de cet état de départ.</p>
<p>J&#8217;ai mis des noms différents pour les paramètres d&#8217;<code>__init__</code> et les attributs de l&#8217;objet, mais en réalité on leur met souvent le même nom par convention. Donc l&#8217;exemple ci-dessus s&#8217;écrirait plutôt :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Voiture:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, carburant=<span style="color: #ff4500;">100</span>, couleur=<span style="color: #483d8b;">&quot;noire&quot;</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> = carburant
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> = couleur</pre></div></div>

<p><code>carburant</code> et <code>couleur</code> ne sont pas la même chose que <code>self.carburant</code> et <code>self.couleur</code> : les premiers n&#8217;existent que dans <code>__init__</code>. Une fois qu&#8217;<code>__init__</code> a fini de s’exécuter, ils disparaissent. Les seconds sont des attributs de l&#8217;objet en cours, et sont donc toujours disponibles tant que l&#8217;objet existe. Le fait qu&#8217;ils portent le même nom ne pose aucun problème car la syntaxe <code>self.<attribut></code> les différencies.</p>
<h2>Résumé final</h2>
<p>La classe, c&#8217;est un plan. </p>
<p>L&#8217;objet, c&#8217;est ce qu&#8217;on créé avec le plan. </p>
<p>Une méthode, c&#8217;est une fonction déclarée dans une classe (qui est attachée à chaque objet produit, et on lui passe en premier paramètre l&#8217;objet en cours). </p>
<p>Un attribut, c&#8217;est une variable attachée à un objet. </p>
<p>Une instance d&#8217;une classe, c&#8217;est l&#8217;objet issu d&#8217;une classe.</p>
<p><a href="https://fr.wikipedia.org/wiki/Spermophile">Un spermophile</a>, c&#8217;est un animal dont la queue est assez courte et plus ou moins fournie. Il aime être à 4 pattes et mange parfois des glands. Ça n&#8217;a rien à voir, mais je me suis dit qu&#8217;il fallait faire passer l&#8217;info. Ah oui, et la cuniculture, <a href="https://fr.wikipedia.org/wiki/Cunniculture">c&#8217;est prendre soin d&#8217;un lapinou</a>. La levrette, par contre, n&#8217;est pas la femelle du lièvre. </p>
<p>Le vocabulaire en informatique, <a href="http://danstonchat.com/14113.html">c&#8217;est primordial</a>.</p>
<p>(La partie 2 arrivera quand elle arrivera)</p>


feed_id: http://sametmax.com/?p=4150
title: TypeError: Error when calling the metaclass bases function() argument 1 must be code, not str
uri: TypeError-Error-when-calling-the-metaclass-bases-function()-argument
url:
http://sametmax.com/typeerror-error-when-calling-the-metaclass-bases-function-argument-1-must-be-code-not-str/

content:
<p>Cette erreur est souvent déclenchée quand on essaye d&#8217;hériter d&#8217;une fonction au lieu d&#8217;une classe. Cela peut arriver par erreur avec des fonctions qui sont nommées en CamelCase, en dépit du PEP8.</p>
<p>Par exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Truc<span style="color: black;">&#40;</span><span style="color: #dc143c;">threading</span>.<span style="color: black;">Condition</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Machine<span style="color: black;">&#40;</span><span style="color: #dc143c;">tempfile</span>.<span style="color: black;">NamedTemporaryFile</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>Lèveront l&#8217;exception :</p>
<pre>TypeError: Error when calling the metaclass bases
    function() argument 1 must be code, not str</pre>
<p>Car:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>, <span style="color: #dc143c;">tempfile</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">threading</span>.<span style="color: black;">Condition</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>type <span style="color: #483d8b;">'function'</span><span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">tempfile</span>.<span style="color: black;">NamedTemporaryFile</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&lt;</span>type <span style="color: #483d8b;">'function'</span><span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>Malgré leurs noms en majuscule.</p>
<p>Le message d&#8217;erreur est lui-même complètement obscure. Bref, le genre de truc qui est 100% lié à des erreurs d&#8217;autres personnes que vous aller payer par une après-midi de debug si on ne vous donne pas la solution. </p>
<p>Mais bon, la queue de celui qui n&#8217;a jamais pourri l&#8217;après-midi d&#8217;un autre codeur avec son travail merdique jette le premier parpaing.</p>


feed_id: http://sametmax.com/?p=4166
title: Un peu de théorie sur la masturbation féminine en vidéo
uri: Un-peu-de-théorie-sur-la-masturbation-féminine-en-vidéo
url: http://sametmax.com/un-peu-de-theorie-sur-la-masturbation-feminine-en-video/
content:
<p>Internet contient un énorme vivier de vidéos pornos pour mecs, qui permettent aux gonzesses d&#8217;apprendre assez rapidement les bases de la prise en main du pénis. Après il faut juste varier un peu, s&#8217;adapter. Mais les bases sont là.</p>
<p>Par contre, quand il s&#8217;agit pour nous de prendre en main ou en bouche un minou, on est vachement moins documenté, et ça se fait au try/except dans une for loop du programme de notre vie.</p>
<p>Rien ne vaut la pratique, mais voici quelques rares bonnes vidéos qu&#8217;on peut trouver sur le sujet. They will make you suck less. Or more.</p>
<p>Un peu d&#8217;anatomie d&#8217;abord, car on ne compte pas le nombre de mecs qui n&#8217;ont pas eu l&#8217;occasion de s&#8217;arrêter deux minutes pour faire l&#8217;état des lieux. Cette vidéo est la seul qui demande une bonne compréhension de l&#8217;anglais, les autres sont plus visuelles :</p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe width="510" height="400" src="http://xhamster.com/xembed.php?video=1674071" frameborder="0" scrolling="no" class="iframe-class"></iframe>
<p>Ensuite un massage intégral avec finition manuelle. Max me l&#8217;a envoyé en chat récemment.</p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe width="510" height="400" src="http://sextvx.com/embed/241321" frameborder="0" scrolling="no" class="iframe-class"></iframe>
<p>Le détail que la vidéo ne dit pas : il ne faut pas que la meuf ait froid. Donc montez le chauffage, et passez vos mains sous l&#8217;eau chaude avant de commencer.</p>
<p>Pour finir quelques techniques avancées : </p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe src="http://www.youjizz.com/videos/embed/2363024" frameborder="0" width="510" height="400" scrolling="no" allowtransparency="true" class="iframe-class"></iframe>
<p>Certaines filles ne sont pas à l&#8217;aise avec l&#8217;idée mais finalement aiment ça, d&#8217;autres veulent essayer mais finalement n&#8217;aiment pas. Au final, aucun moyen de savoir avant de le faire, alors tentez le coup. </p>
<p><a href="https://en.wikipedia.org/wiki/Nina_hartley">Nina Hartley</a>, la MILF de la vidéo est une ancienne actrice porno qui s&#8217;est rendu célèbre en se spécialisant dans les leçons de sexualité pour hommes et femmes en atelier ou vidéo. Si vous cherchez &#8220;Nina Hartley&#8217;s Guide&#8221; (que vous soyez un mec ou une nana), vous allez être surpris du nombre de trucs que vous n&#8217;avez jamais testé.</p>
<p>Voilà, c&#8217;était pour changer une peu du ramonage sauvage en levrette.</p>


feed_id: http://sametmax.com/?p=4179
title: La télé et le cerveau – vidéoconférence de Michel Desmurget
uri: La-télé-et-le-cerveau-vidéoconférence-de-Michel-Desmurget
url: http://sametmax.com/la-tele-et-le-cerveau-videoconference-de-michel-desmurget/
content:
<p>Michel Desmurget est un chercheur français spécialisé en neurosciences cognitives. Il a rédigé un ouvrage, TV Lobotomie &#8211; la vérité scientifique sur les effets de la télévision (publié en 2011), qui dénonce l&#8217;influence de la télévision sur la santé des personnes.</p>
<p>Donnez-vous la peine de regarder cette conférence, même si ça dure 1H30. C&#8217;est très interressant.</p>
<p>Je ne vous fais pas de résumé car je suis une feignasse d&#8217;une, et de deux si je fais un résumé personne va la regarder et se contenter de lire ma vision de la chose car j&#8217;aurais forcément choisi les passages qui m&#8217;intéressent :p</p>
<p><iframe src="http://www.dailymotion.com/embed/video/xpjec4" frameborder="0" width="560" height="420"></iframe><br />
<a href="http://www.dailymotion.com/video/xpjec4_tv-lobotomie-la-verite-scientifique-sur-les-effets-de-la-television-conference-michel-desmurget-fsl5_news" target="_blank">TV Lobotomie &#8211; La vérité scientifique sur les&#8230;</a> <em>par <a href="http://www.dailymotion.com/fsl56-org" target="_blank">fsl56-org</a></em></p>
<p>&nbsp;</p>
<p>Prenez le temps&#8230; Vous ne le regretterez pas.</p>


feed_id: http://sametmax.com/?p=4185
uri: 2013-01-18-Le-guide-ultime-et-définitif-sur-la-programmation-orientée-objet-en
title:
Le guide ultime et définitif sur la programmation orientée objet en Python à l’usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 2.

url:
http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-2/

content:
<p>Prérequis pour cette partie :</p>
<ul>
<li>avoir lu la <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-1/#comment-5151">partie 1</a>.</li>
<li>comprendre <a href="http://sametmax.com/comment-utiliser-yield-et-les-generateurs-en-python/">yield</a>.</li>
<li>comprendre les <a href="http://sametmax.com/comprendre-les-decorateurs-python-pas-a-pas-partie-1/">décorateurs</a>.</li>
<li>comprendre les bases du format <a href="http://fr.wikipedia.org/wiki/Comma-separated_values">CSV</a> et <a href="https://fr.wikipedia.org/wiki/Json">JSON</a>.</li>
</ul>
<h2>Rappel</h2>
<p>On créé des objets en instanciant des classes. Les classes sont des plans décrivant les objets, et notamment déclarant leurs méthodes (le comportement) et leurs attributs (les données) :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ArticleDeSamEtMax:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, titre<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">titre</span> = titre
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> article = ArticleDeSamEtMax<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Votre Python aime les pip'</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> article.<span style="color: black;">titre</span>
Votre Python aime les pip<span style="color: #483d8b;">'</span></pre></div></div>

<p>Les méthodes nommées <code>__methode__</code> (avec deux underscores de chaque côté) sont appelées automatiquement dans certaines conditions. <code>__init__</code> est appelée automatiquement après la création de l&#8217;objet, et on s&#8217;en sert pour créer l&#8217;état de départ de l&#8217;objet (initialiser).</p>
<p>La chose la plus difficile à comprendre au début est <code>self</code>, l&#8217;objet en cours. Pour nous aider un peu, utilisons la fonction <code>id()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;bip&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">22114176</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">13.2</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">22417496</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">20801584</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>article<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">21427120</span></pre></div></div>

<p><code>id()</code> retourne un identifiant unique pour chaque objet. Imaginez le comme &#8220;l&#8217;adresse en mémoire&#8221; d&#8217;un l&#8217;objet.</p>
<p>Maintenant créons une méthode qui identifie un peu <code>self</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ArticleDeSamEtMax:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, titre<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">titre</span> = titre
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> print_self<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">self</span>.<span style="color: black;">titre</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">self</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> article1 = ArticleDeSamEtMax<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;La théorie de la salle de bain&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> article2 = ArticleDeSamEtMax<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Mieux de fesse que de face&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Si j&#8217;affiche le titre et les id de l&#8217;article 1, ça donne ça :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> article1.<span style="color: black;">titre</span>
La théorie de la salle de bain
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> article1
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">ArticleDeSamEtMax</span> instance at 0x1635488<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>article1<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">23286920</span></pre></div></div>

<p>Et regardez le print_self :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> article1.<span style="color: black;">print_self</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
La théorie de la salle de bain
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">ArticleDeSamEtMax</span> instance at 0x1635488<span style="color: #66cc66;">&gt;</span>
<span style="color: #ff4500;">23286920</span></pre></div></div>

<p>C&#8217;est exactement la même chose ! <code>self</code> EST <code>article1</code> puisque <code>self</code> est l&#8217;objet en cours.</p>
<p>Pareil pour l&#8217;article2:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> article2.<span style="color: black;">titre</span>
Mieux de fesse que de face
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> article2
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">ArticleDeSamEtMax</span> instance at 0x16355a8<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>article2<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">23287208</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> article2.<span style="color: black;">print_self</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Mieux de fesse que de face
<span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">ArticleDeSamEtMax</span> instance at 0x16355a8<span style="color: #66cc66;">&gt;</span>
<span style="color: #ff4500;">23287208</span></pre></div></div>

<p>C&#8217;est cela la notion de l&#8217;objet en cours. Python passe automatiquement l&#8217;objet à lui-même, de telle sorte que chaque méthode ait une référence à lui-même pour pouvoir lire et modifier ses propres attributs.</p>
<h2>Maintenant on en fait quoi ?</h2>
<p>La POO a pour principal attrait de permettre de proposer une belle API, c&#8217;est à dire de créer du code réutilisable et facile à manipuler. Comme je vous le disais précément, il n&#8217;y a rien qu&#8217;on puisse faire en POO qu&#8217;on ne puisse faire autrement. On va surtout l&#8217;utiliser pour donner un style au code.</p>
<p>En fait, on fait de la POO pour celui qui va utiliser votre code plus tard.</p>
<h2>Amusons-nous un peu avec le Web online de l&#8217;Internet</h2>
<p>Imaginez, vous voulez proposer une bibliothèque qui permettent de récupérer les 100 dernières questions postées à propos de Python sur le site <a href="http://stackoverflow.com/">Stackoverflow</a>. Heureusement Stackoverflow est très ouvert, et propose même d&#8217;avoir accès à leur base de données (avec quelques jours de retard) assez directement depuis data.stackexchange.com.</p>
<p>Premièrement, il faut créer un export de la base de données de Stackoverflow. Ca ne fait pas partie de la POO, alors je vous le donne <a href="http://data.stackexchange.com/stackoverflow/query/92558/last-100-python-questions">tout fait</a>.</p>
<p>Cet export peut être récupéré au <a href="http://data.stackexchange.com/StackOverflow/csv/109782">format CSV,</a> du coup on pourra télécharger nos données sous cette forme :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">CreationDate,Post Link
<span style="color: #483d8b;">&quot;2013-01-13 12:42:41&quot;</span>,<span style="color: #483d8b;">&quot;{
  &quot;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: #483d8b;">&quot;: &quot;</span><span style="color: #483d8b;">&quot;How to convert float point to hex representation according IEEE754 in Python?&quot;</span><span style="color: #483d8b;">&quot;,
  &quot;</span><span style="color: #483d8b;">&quot;id&quot;</span><span style="color: #483d8b;">&quot;: 14303571
}&quot;</span>
<span style="color: #483d8b;">&quot;2013-01-13 12:40:12&quot;</span>,<span style="color: #483d8b;">&quot;{
  &quot;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: #483d8b;">&quot;: &quot;</span><span style="color: #483d8b;">&quot;catch exceptions that caused by connection error in ftplib&quot;</span><span style="color: #483d8b;">&quot;,
  &quot;</span><span style="color: #483d8b;">&quot;id&quot;</span><span style="color: #483d8b;">&quot;: 14303548yt
}&quot;</span>
<span style="color: #483d8b;">&quot;2013-01-13 12:35:47&quot;</span>,<span style="color: #483d8b;">&quot;{
  &quot;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: #483d8b;">&quot;: &quot;</span><span style="color: #483d8b;">&quot;variable type checking&quot;</span><span style="color: #483d8b;">&quot;,
  &quot;</span><span style="color: #483d8b;">&quot;id&quot;</span><span style="color: #483d8b;">&quot;: 14303498
}&quot;</span>
...</pre></div></div>

<p>Pour lire les données et les récupérer, pas besoin de POO, un petit script Python procédural fait très bien le taff :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> io <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># l'URL du CSV</span>
URL = <span style="color: #483d8b;">&quot;http://data.stackexchange.com/StackOverflow/csv/109782&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># on télécharge les données, on les décode et on les enrobe dans</span>
<span style="color: #808080; font-style: italic;"># StringIO pour qu'elles soient lisible de la même manière qu'un fichier</span>
<span style="color: #808080; font-style: italic;"># malgré le fait qu'elles soient juste en mémoire</span>
csv_data = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>URL<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># on utilise le module CSV pour lire notre &quot;fichier&quot; CSV</span>
<span style="color: #808080; font-style: italic;"># DictReader retourne une liste de dictionnaires, un pour chaque entrée du &quot;fichier&quot;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">csv</span>.<span style="color: black;">DictReader</span><span style="color: black;">&#40;</span>csv_data<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># et on a accès aux données de chaque question</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># afficher la date de création</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># afficher le titre et l'id de la question</span></pre></div></div>

<p>C&#8217;est bien, c&#8217;est facile et ça marche :</p>
<pre>2013-01-13 12:42:41
{
  "title": "How to convert float point to hex representation according IEEE754 in Python?",
  "id": 14303571
}
2013-01-13 12:40:12
{
  "title": "catch exceptions that caused by connection error in ftplib",
  "id": 14303548
}
...</pre>
<p>Astuce au passage : si vous ouvrez le CSV issu de data.stackexchange.com, vous noterez qu&#8217;il y a plein de petits détails qui rendent ce format pas toujours facile à parser. Plutôt que d&#8217;y aller comme un bourrin avec des <code>split()</code>, nous utilisons donc le module <code>csv</code> pour récupérer chanque entrée du fichier comme un dictionnaire qui aura la structure:</p>
<p><code>{'nom_de_colonne': 'valeur_pour_cette_ligne', ...}</code></p>
<p>On est cependant loin d&#8217;avoir une bibliothèque réutilisable. On peut commencer à faire une fonction réutilisable :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> io <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
&nbsp;
&nbsp;
DATA_SOURCE_URL = <span style="color: #483d8b;">&quot;http://data.stackexchange.com/StackOverflow/csv/109782&quot;</span>
QUESTION_URL = <span style="color: #483d8b;">&quot;http://stackoverflow.com/questions/{id}&quot;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> download_questions<span style="color: black;">&#40;</span>url=DATA_SOURCE_URL<span style="color: black;">&#41;</span>:
&nbsp;
    csv_data = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">csv</span>.<span style="color: black;">DictReader</span><span style="color: black;">&#40;</span>csv_data<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># on transforme la chaîne date en objet datetime</span>
        question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span> = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span>,
                                                     <span style="color: #483d8b;">'%Y-%m-%d %H:%M:%S'</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># le deuxième champ est au format JSON</span>
        <span style="color: #808080; font-style: italic;"># alors on le transforme en objet Python</span>
        question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span> = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># on ajoute l'url de la question générée à partir de l'ID</span>
        question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'url'</span><span style="color: black;">&#93;</span> = QUESTION_URL.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">yield</span> question</pre></div></div>

<p>On pourrait l&#8217;importer et faire :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> download_questions<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># affiche le titre et l'url</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>On obtient l&#8217;affichage suivant :</p>
<pre>How to convert float point to hex representation according IEEE754 in Python? : http://stackoverflow.com/questions/14303571
catch exceptions that caused by connection error in ftplib : http://stackoverflow.com/questions/14303548
variable type checking : http://stackoverflow.com/questions/14303498
Convert python to a pseudo code : http://stackoverflow.com/questions/14303484
How to insert annotation into pdf with Python : http://stackoverflow.com/questions/14303418</pre>
<p>Et ce n&#8217;est pas une mauvaise façon de faire. On peut également faire des interfaces très sympas en programmation fonctionnelle, mais ce n&#8217;est pas le but de l&#8217;article.</p>
<h2>Voyons comment on ferait ça en POO</h2>
<p>Si on utilise uniquement les outils qu&#8217;on a vue jusqu&#8217;ici, voici ce qu&#8217;on obtient :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> io <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
&nbsp;
&nbsp;
DATA_SOURCE_URL = <span style="color: #483d8b;">&quot;http://data.stackexchange.com/StackOverflow/csv/109782&quot;</span>
QUESTION_URL = <span style="color: #483d8b;">&quot;http://stackoverflow.com/questions/{id}&quot;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># au crée un objet question dans lequel on va mettre les données de notre dico</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Question:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">id</span>, title, creation_date<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># self est le fameux &quot;object en cours&quot;, on lui attache les attributs</span>
        <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> = <span style="color: #008000;">id</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">title</span> = title
        <span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span> = creation_date
&nbsp;
    <span style="color: #808080; font-style: italic;"># on va générer ces valeurs à la lecture, pas à l'écriture comme</span>
    <span style="color: #808080; font-style: italic;"># tout à l'heure</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> get_creation_date<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span>, <span style="color: #483d8b;">'%Y-%m-%d %H:%M:%S'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_url<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> QUESTION_URL.<span style="color: black;">format</span><span style="color: black;">&#40;</span>title=<span style="color: #008000;">self</span>.<span style="color: black;">title</span>, <span style="color: #008000;">id</span>=<span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># maintenant notre fonction nous retourne des objets Question</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> download_questions<span style="color: black;">&#40;</span>url=DATA_SOURCE_URL<span style="color: black;">&#41;</span>:
&nbsp;
        csv_data = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">csv</span>.<span style="color: black;">DictReader</span><span style="color: black;">&#40;</span>csv_data<span style="color: black;">&#41;</span>:
&nbsp;
            question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span> = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># au lieu de retourner des dictionaires, on retourne</span>
            <span style="color: #808080; font-style: italic;"># des objets Question</span>
            <span style="color: #ff7700;font-weight:bold;">yield</span> Question<span style="color: black;">&#40;</span>creation_date=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span>,
                           <span style="color: #008000;">id</span>=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span>,
                           title=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Donc on a encore une fonction, sauf que cette fois elle ne sort plus des dicos, mais des objets <code>Question</code>. A première vue ça n&#8217;a pas l&#8217;air très intéressant. Ca fait la même chose, mais c&#8217;est plus long.</p>
<p>Par contre on a déjà un petit changement du côté de l&#8217;utilisation, et c&#8217;est ça qu&#8217;on vise :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> download_questions<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># affiche le titre et l'url</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>title=question.<span style="color: black;">title</span>, url=question.<span style="color: black;">get_url</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Au lieu d&#8217;avoir un dictionnaire qui pourrait contenir n&#8217;importe quoi, on a un objet question, avec un titre, et la possibilité de construire l&#8217;URL.</p>
<h2>Petit détour par les attributs de classe</h2>
<p>La POO, ce n&#8217;est pas juste faire des objets, c&#8217;est aussi les habiller.</p>
<p>Dans notre cas on a moitié fonction, moitié classe. On a des variables globales qui trainent. C&#8217;est pas terrible. On pourrait arranger ça avec des attributs de classe. Retour à un peu de théorie.</p>
<p>Un attribut de classe est un attribut qui appartient, non pas à l&#8217;objet, mais à la classe.</p>
<p>Par exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> UnObjetQuiPassaitParLa:
&nbsp;
    un_attribut_de_classe = <span style="color: #483d8b;">'meme valeur pour pour tous les objets'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">attribut_d_objet</span> = <span style="color: #483d8b;">&quot;valable seulement pour l'objet en cours&quot;</span></pre></div></div>

<p><code>un_attribut_de_classe</code> est accessible depuis <code>UnObjetQuiPassaitParLa</code>, sans créer d&#8217;instance, donc sans avoir à faire <code>UnObjetQuiPassaitParLa()</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> UnObjetQuiPassaitParLa.<span style="color: black;">un_attribut_de_classe</span>
meme valeur pour tous les objets et la classe
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> UnObjetQuiPassaitParLa.<span style="color: black;">attribut_d_objet</span>
&nbsp;
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;pyshell#1&gt;&quot;</span>, line <span style="color: #ff4500;">11</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> UnObjetQuiPassaitParLa.<span style="color: black;">attribut_d_objet</span>
<span style="color: #008000;">AttributeError</span>: <span style="color: #ff7700;font-weight:bold;">class</span> UnObjetQuiPassaitParLa has no attribute <span style="color: #483d8b;">'attribut_d_objet'</span></pre></div></div>

<p>Par contre <code>attribut_d_objet</code> n&#8217;est pas accessible si on a pas d&#8217;instance.</p>
<p>Une instance a accès aux deux:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> instance.<span style="color: black;">un_attribut_de_classe</span>
meme valeur pour tous les objets et la classe
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> instance.<span style="color: black;">attribut_d_objet</span>
valable seulement pour l<span style="color: #483d8b;">'objet en cours</span></pre></div></div>

<p>Les attributs de classe ont d&#8217;autres propriétés intéressantes, mais on va s&#8217;arrêter là pour le moment.</p>
<p>On peut aussi créer des méthodes de classe. C&#8217;est le même principe:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> UnObjetQuiPassaitParLa:
...
...     @<span style="color: #008000;">classmethod</span> <span style="color: #808080; font-style: italic;"># &lt;- tranforme la méthode en méthode de classe</span>
...     <span style="color: #ff7700;font-weight:bold;">def</span> methode_de_classe<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
...
...         <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;yeah baby&quot;</span>
...
... <span style="color: black;">UnObjetQuiPassaitParLa</span>.<span style="color: black;">methode_de_classe</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
yeah baby</pre></div></div>

<p>On utilise ici un décorateur, qui dit que la méthode est une méthode de classe, donc accessible sans créer aucune instance.</p>
<p>Notez que la convention de nommage change : le premier argument n&#8217;est plus nommé <code>self</code> mais <code>cls</code>. C&#8217;est parce que le premier argument sera &#8220;la classe en cours&#8221; (<code>UnObjetQuiPassaitParLa</code>) et non plus &#8220;l&#8217;object en cours&#8221; (<em>une instance</em> de <code>UnObjetQuiPassaitParLa</code>).</p>
<p>Bon, tout ça c&#8217;est très flou pour le moment. Appliquons.</p>
<h2>Little Boxes on the hill side</h2>
<p>L&#8217;interêt de ça, c&#8217;est que ça va nous permettre de regrouper tout ce qui a un rapport avec notre objet <code>Question</code> dans la classe.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> io <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Question:
&nbsp;
    <span style="color: #808080; font-style: italic;"># ces constantes sont maintenant des attributs de classe</span>
    DATA_SOURCE_URL = <span style="color: #483d8b;">&quot;http://data.stackexchange.com/StackOverflow/csv/109782&quot;</span>
    QUESTION_URL = <span style="color: #483d8b;">&quot;http://stackoverflow.com/questions/{id}&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">id</span>, title, creation_date<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># self est le fameux &quot;object en cours&quot;, on lui attache les attributs</span>
        <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> = <span style="color: #008000;">id</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">title</span> = title
        <span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span> = creation_date
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_creation_date<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span>, <span style="color: #483d8b;">'%Y-%m-%d %H:%M:%S'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_url<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">QUESTION_URL</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=<span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># la fonction qui fabrique tous les objets Question est maintenant</span>
    <span style="color: #808080; font-style: italic;"># à l'intérieur de la class Question, en tant que méthode de classe</span>
    @<span style="color: #008000;">classmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> query<span style="color: black;">&#40;</span>cls, url=DATA_SOURCE_URL<span style="color: black;">&#41;</span>:
&nbsp;
            csv_data = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">csv</span>.<span style="color: black;">DictReader</span><span style="color: black;">&#40;</span>csv_data<span style="color: black;">&#41;</span>:
&nbsp;
                question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span> = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">yield</span> Question<span style="color: black;">&#40;</span>creation_date=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span>,
                               <span style="color: #008000;">id</span>=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span>,
                               title=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>C&#8217;est ce qu&#8217;on appelle l&#8217;<strong>encapsulation</strong>. On fout tous les trucs qui ont un rapport entre eux dans la même boîte, et on laisse la boîte s&#8217;occuper de comment ça marche en interne.</p>
<p>Et là on commence à avoir une API très mignone :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Questions from : {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>Question.<span style="color: black;">DATA_SOURCE_URL</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> Question.<span style="color: black;">query</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># affiche le titre et l'url</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>title=question.<span style="color: black;">title</span>, url=question.<span style="color: black;">get_url</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Tout part de l&#8217;objet <code>Question</code>. Si on cherche quelque chose liée à l&#8217;objet <code>Question</code>, on doit faire<code> Question.< un_truc ></code>. On peut expérimenter dans le shell avec la complétion du code. En regardant ce bout de code, pas besoin de savoir comment <code>Question</code> marche pour savoir ce que ça fait. C&#8217;est assez explicite.</p>
<p>On peut encore faire un peu mieux.</p>
<h2>Les properties</h2>
<p>Les propriétés, ou properties dans la langue de Cameron Diaz, sont des outils qui déguisent des méthodes pour les faire passer pour des attributs. L&#8217;exemple le plus simple est le suivant :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> UnObjetQuiPassaitParLa:
...
...     <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, valeur<span style="color: black;">&#41;</span>:
...         <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span> = valeur
...
...
...     <span style="color: #ff7700;font-weight:bold;">def</span> get_valeur_au_carre<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
...
...         <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> objet = UnObjetQuiPassaitParLa<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> objet.<span style="color: black;">get_valeur_au_carre</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">4</span></pre></div></div>

<p>C&#8217;est moche et verbeux. Avec une prioperty, on dit à Python &#8220;fait comme si cette méthode était un banal attribut&#8221; :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> UnObjetQuiPassaitParLa:
...
...     <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, valeur<span style="color: black;">&#41;</span>:
...         <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span> = valeur
...
...     @<span style="color: #008000;">property</span> <span style="color: #808080; font-style: italic;"># &lt;- tranforme la méthode en propriété</span>
...     <span style="color: #ff7700;font-weight:bold;">def</span> carre<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
...
...         <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">self</span>.<span style="color: black;">valeur</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> objet = UnObjetQuiPassaitParLa<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> objet.<span style="color: black;">carre</span>
<span style="color: #ff4500;">4</span></pre></div></div>

<p>Le décorateur  <code>@property</code> transforme la méthode <code>carre()</code> et on peut l&#8217;utiliser sans parenthèse.</p>
<p>Appliquons cela à notre exemple :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> io <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Question:
&nbsp;
    <span style="color: #808080; font-style: italic;"># ces constantes sont maintenant des attributs de classe</span>
    DATA_SOURCE_URL = <span style="color: #483d8b;">&quot;http://data.stackexchange.com/StackOverflow/csv/109782&quot;</span>
    QUESTION_URL = <span style="color: #483d8b;">&quot;http://stackoverflow.com/questions/{id}&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">id</span>, title, creation_date<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># self est le fameux &quot;object en cours&quot;, on lui attache les attributs</span>
        <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span> = <span style="color: #008000;">id</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">title</span> = title
        <span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span> = creation_date
&nbsp;
    <span style="color: #808080; font-style: italic;"># on donne aux méthodes des noms plus simples, et on applique</span>
    <span style="color: #808080; font-style: italic;"># le décorateur @property dessus</span>
&nbsp;
    @<span style="color: #008000;">property</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> created<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">creation_date</span>, <span style="color: #483d8b;">'%Y-%m-%d %H:%M:%S'</span><span style="color: black;">&#41;</span>
&nbsp;
    @<span style="color: #008000;">property</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> url<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">QUESTION_URL</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=<span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># la fonction qui fabrique tous les objets Question est maintenant</span>
    <span style="color: #808080; font-style: italic;"># à l'intérieur de la class Question, en tant que méthode de classe</span>
    @<span style="color: #008000;">classmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> query<span style="color: black;">&#40;</span>cls, url=DATA_SOURCE_URL<span style="color: black;">&#41;</span>:
&nbsp;
            csv_data = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">csv</span>.<span style="color: black;">DictReader</span><span style="color: black;">&#40;</span>csv_data<span style="color: black;">&#41;</span>:
&nbsp;
                question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span> = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">yield</span> Question<span style="color: black;">&#40;</span>creation_date=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'CreationDate'</span><span style="color: black;">&#93;</span>,
                               <span style="color: #008000;">id</span>=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span>,
                               title=question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Ca ne change pas grand chose, mais on peut virer le très moche <code>get_url()</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Questions from : {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>Question.<span style="color: black;">DATA_SOURCE_URL</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> Question.<span style="color: black;">query</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># affiche le titre et l'url</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>title=question.<span style="color: black;">title</span>, url=question.<span style="color: black;">url</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>Conclusion très provisoire</h2>
<p>On a amélioré notre compréhension de l&#8217;usage de la POO dans le monde réel. Le code se complexifie côté bibliothèque. Par contre côté utilisateur final, on passe de ça :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> question_lib <span style="color: #ff7700;font-weight:bold;">import</span> download_questions, DATA_SOURCE_URL
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Questions from : {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>DATA_SOURCE_URL<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> download_questions<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>question<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Post Link'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p> A :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> question_lib <span style="color: #ff7700;font-weight:bold;">import</span> Question
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Questions from : {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>Question.<span style="color: black;">DATA_SOURCE_URL</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> question <span style="color: #ff7700;font-weight:bold;">in</span> Question.<span style="color: black;">query</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># affiche le titre et l'url</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{title} : {url}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>title=question.<span style="color: black;">title</span>, url=question.<span style="color: black;">url</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Le style change, la manière dont sont exposées les données n&#8217;est pas la même. Sur cette exemple simple, la complexité ajoutée pour le résultat fait que le jeu peut ne pas en valoir la chandelle. Sur des codes très gros, cela peut changer la vie.</p>
<p><a href="http://sametmax.com/path-py-plus-en-detail/">path.py</a> est un très bel exemple de cela : l&#8217;API est belle et simple (beaucoup plus que ce que propose la lib standard pour faire la même chose). Cela valait la complexité du <a href="https://github.com/jaraco/path.py/blob/master/path.py">code source</a> pour obtenir ce résultat.</p>
<p>Un autre avantage de l&#8217;encapsulation, c&#8217;est que même si demain Stackoverflow change son format de données (ce n&#8217;est plus un CSV mais un XML par exemple), on a juste a apdater la classe. <strong>Le code qui utilise classe, lui, n&#8217;aura pas besoin de changer</strong>. Une bonne encapsulation (qu&#8217;on peut faire sans POO, mais la POO est spécialisée pour ça), aide les utilisateurs finaux de votre lib car ils savent que leur code ne devrait pas trop changer.</p>
<p>On en va bien entendu pas s&#8217;arrêter là, car on peut faire beaucoup mieux. Ce n&#8217;était qu&#8217;un avant goût pédagoqique. Sautez à la <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-3/">partie 3</a>.</p>


feed_id: http://sametmax.com/?p=4203
title: On est en 2013, on a marché sur la lune, mais on a toujours pas…
uri: On-est-en-2013-on-a-marché-sur-la-lune-mais-on-a-toujours-pas
url: http://sametmax.com/on-est-en-2013-on-a-marche-sur-la-lune-mais-on-a-toujours-pas/
content:
<p>De logiciels pratiques pour :</p>
<ul>
<li>Partager un fichier avec un pote à dans une autre ville.</li>
<li>Ouvrir, croper, flouter, flécher et annoter une photo puis partager.</li>
<li>Gérer son DVCS de manière graphique.</li>
<li>Faire un backup de son ordi.</li>
<li>Faire un schéma.</li>
<li>Prendre des notes d&#8217;un cours.</li>
<li>Sélectionner des fichiers / les renommer / remplacer du texte dedans.</li>
<li>Travailler dans un terminal.</li>
<li>Lire ses flux RSS.</li>
<li>(micro)-Blogger, partager des photos et des liens tout en un.</li>
<li>Chatter.</li>
<li>Envoyer des emails.</li>
<li>Gérer ses clés de chiffrement.</li>
<li>Chiffrer une partition.</li>
<li>Gérer et synchroniser ses contacts.</li>
</ul>
<p>Ca ne veut pas dire qu&#8217;il n&#8217;y a pas déjà de bons logiciels pour faire cela, mais ils ont tous des lacunes graves.</p>
<p>Mes critères d&#8217;évaluation sont : simple, multiplate-forme, rapide, permet les opérations avancées les plus courantes, bien intégré, interopérable, gérant plusieurs sources de données.</p>
<p>J&#8217;ai des logiciels pour tout ça. J&#8217;en ai essayé des centaines. N&#8217;essayez même pas de me proposer les votre, je les ai déjà essayé. Tous. Les proprios, ceux sur d&#8217;autres OS, ceux juste en japonais&#8230; Tous je vous dis.</p>
<p>Qu&#8217;on vienne pas me sortir que l&#8217;innovation est maintenant réservées aux grosse boîtes.</p>
<p>Mais coder, c&#8217;est dur. Faire du bon boulot, c&#8217;est dur.</p>
<h2>Partager un fichier avec un pote à dans une autre ville</h2>
<p>On a webrtc. On a le P2P. On a le chat et la VOIP. Mais un simple logiciel qui permette d&#8217;avoir sa liste d&#8217;amis basés sur ses contacts et qui envoit un fichier avec drag and drop ? Hier, 3 heures pour envoyer un jpeg par skype&#8230; Je vous parle même pas d&#8217;un ISO.</p>
<p>Si je ma mère fait un film avec son apareil photo et qu&#8217;elle veut me l&#8217;envoyer, alors là, je suis bon pour attendre le prochain repas de famille.</p>
<h2>Ouvrir, croper, flouter, flécher et annoter une photo puis partager</h2>
<p>99 % de mon activité photographique. Le plus proche dans le genre c&#8217;est Photofiltre et l&#8217;éditeur de photos de shutters. Skitch est pas mal du tout, mais ultra proprio et bien entendu pas sous Linux.</p>
<h2>Gérer son DVCS de manière graphique</h2>
<p>L&#8217;arlésienne. Mais non, Tortoise n&#8217;est pas une solution. L&#8217;app Github est pas mal, mais dès qu&#8217;on veut faire un truc un peu avancé&#8230; Recherche, comparaison, merge, bonnes pratiques par défaut, rien de tout ça n&#8217;est intégré. Le pull et le push, je le fais très bien en ligne de commande, merci.</p>
<h2>Faire un backup de son ordi</h2>
<p>Après avoir tout essayé. 3 fois. J&#8217;en reviens à <em>(s)cp -fr</em>. MI-NA-BLE. Sérieux.</p>
<p>Entre les softs avec lesquels tu as pas accès à ta sauvegarde sans le soft, ceux qui sont limités en taille de fichier, ceux qui plantent en cours de route, ceux qui font une sauvegarde corrompue, ceux qui n&#8217;affichent rien si il y a une erreur, ceux qui gère pas tous les noms de fichiers, ceux qui gère pas plusieurs medium&#8230;</p>
<p>J&#8217;ai utilisé rsync pendant longtemps (et ses versions graphiques), mais au final, beaucoup de complexité pour rien. Je veux juste sauvegarder mes données, bordel. C&#8217;est une corvée. Je ne veux pas réfléchir. Je ne veux pas passer des heures à le setup.</p>
<h2>Faire un schéma</h2>
<p>Je veux mettre du texte, des boîtes et des flèches. C&#8217;est plus clair pour expliquer des trucs. Je peux pas être le seul à vouloir faire ça non ?</p>
<p>Bref, Dia tout pourri, Visio Microsoft ou inkscape sans connecteur ? Il y a des trucs en lignes aussi. Mais c&#8217;est lent, et on est dépendant d&#8217;un Web service.</p>
<h2>Prendre des notes d&#8217;un cours</h2>
<p>Faire des formes et des flèches à main levées. Insérer du texte de manière flou, des abréviation. Faire de liens dans tous les sens et avoir plusieurs niveau d&#8217;annotation. Tout ça c&#8217;est tellement facile et rapide à faire à la main. Et tellement dur et fastidieux sur un ordi.</p>
<p>Les élèves n&#8217;ont rien pour prendre des notes en cours. L&#8217;ordinateur est actuellement un boulet au pied de l&#8217;étudiant dans un amphi.</p>
<h2>Sélectionner des fichiers / les renommer / remplacer du texte dedans</h2>
<p>Sélectionne-moi récursivement tous les fichier images ajoutés il y a moins de deux semaines.</p>
<p>Pipe moi ça dans un renommer ou un truc pour remplacer du texte, ou n&#8217;importe qu&#8217;elle autre application. En graphique. Intégré au navigateur de fichiers.</p>
<p>Quant au renommer / remplacer de texte. Quiconque a essayé d&#8217;expliquer à sa meuf comment faire l&#8217;opération comprends ma douleur.</p>
<h2>Travailler dans un terminal</h2>
<p>On utilise un terminal tous les jours. Alors pourquoi il faut encore connaître une combinaison de 22 touches pour revenir au milieu d&#8217;une longue commande alors qu&#8217;un simple clic devrait suffire ? Pourquoi on a pas de marque page pour se connecter à ses serveurs distants ? Pourquoi tous terminaux qui font drop down ne font pas split et inversement ? Pourquoi on ne peut pas faire clic milieu sur un chemin de fichier pour ouvrir un nouvel onglet sur ce chemin ? Pourquoi &#8220;dumper la session&#8221; n&#8217;est pas une option par défaut dans tous les terminaux ? Pourquoi il n&#8217;y a pas un historique des chemins visités, un restaurer les onglets, un marque page pour lancer des sessions et groupes d&#8217;onglets,  comme dans un navigateur WEB ?</p>
<p>En résumé : pourquoi oppose-t-on commande texte et graphique ? On est en 2013, on peut avoir l&#8217;ouverture d&#8217;esprit de considérer que masteriser VI n&#8217;exclue pas adorer sa souris, non ?</p>
<p>&#8220;Ben t&#8217;as qu&#8217;a le coder connard&#8221;.</p>
<p>Soit.</p>
<h2>Lire ses flux RSS</h2>
<p>Qui n&#8217;a jamais cliqué sur une news trop vite, marquant comme lu la précédente et la perdant à jamais dans le méandre de ses flux ? (un historique des trucs lus, please)</p>
<p>Qui n&#8217;a jamais lancé une recherche sur ses flux sans jamais trouver l&#8217;article génial qu&#8217;il a lu hier ? (un moteur de recherche décent, please)</p>
<p>Qui n&#8217;a jamais voulu lire ses articles hors lignes ou forcer la page complète plutôt que l&#8217;except de 2 lignes ? (un mode &#8220;download linked page&#8221;, please)</p>
<p>Et pour ceux qui utilise un logiciel desktop plutôt qu&#8217;un énième Web service dont il faudra se sevrer, qui n&#8217;a jamais cliqué sur un lien, et pesté sur le fait que le navigateur Web passe en avant plan ? (un mode &#8220;always on top sans clic droit, please&#8221;)</p>
<h2>(micro)-Blogger, partager des photos et des liens tout en un</h2>
<p>C&#8217;est la même chose, putain. C&#8217;est la même activité. Un titre, du texte, un contenu, peut-être un lien. Il n&#8217;y a pas besoin de 15 logiciels différents. Et ils devraient publier sur tous les réseaux en même temps : le site, twitter, facebook, un FTP, etc.</p>
<p>Le mec commence à taper du texte :</p>
<ul>
<li>Ca commence par un lien ? C&#8217;est un truc type shaarly.</li>
<li>Ca commence par une photo ? C&#8217;est une galery.</li>
<li>Ca fait moins de 140 caractères ? C&#8217;est un microblogging.</li>
<li>Plus ? C&#8217;est un article.</li>
</ul>
<p>Il y a même pas besoin d&#8217;option. Il n&#8217;y a pas besoin de bouton. Les catégorisations et l&#8217;organisation du blog se fait automatiquement.</p>
<h2>Chatter</h2>
<p>L&#8217;historique est pourri. L&#8217;interface est pourrie. Déjà essayé de chatter sur IRC avec un client Jabber ? Donc il faut deux clients. Et la crypto, pourquoi c&#8217;est toujours pas par défaut ? OTR existe depuis 3 millénaires maintenant.</p>
<h2>Envoyer des emails</h2>
<p>La raison pour laquelle personne n’envoie plus de mail dans ma génération (je parle des non geeks), c&#8217;est que c&#8217;est long. C&#8217;est long parce que ça ouvre une autre fenêtre, ça demande d&#8217;entrer un titre, ça demande de spécifier des destinataire. Le chat et le SMS, tu clique sur ta conversation, et tu parles.</p>
<p>Intégrons le mails dans les logiciels de chat. Pour un utilisateur avancé, on pourra toujours avoir des options en plus dans un bouton &#8220;more&#8221;.</p>
<h2>Gérer ses clés de chiffrement</h2>
<p>Je veux une manière multiplateforme et sécurisée pour gérer mes clés de chiffrement. Pour le moment j&#8217;ai une partition TrueCrypt avec mes clés dedans sous forme de fichier texte. C&#8217;est triste.</p>
<h2>Chiffrer une partition</h2>
<p>True crypt c&#8217;est cool. Sauf que personne ne sait l&#8217;utiliser à part les nerds. Même la plupart des geeks ne connaissent pas son existence.</p>
<h2>Gérer et synchroniser ses contacts</h2>
<p>Vingt-douze-milles contacts mails répartis sur 15 adresses. Des adresses de chat. Des contact sur des réseaux sociaux. Des ordis avec plusieurs OS, des web services, des téléphones. Le merdier.</p>


feed_id: http://sametmax.com/?p=4196
title: Cases
uri: Cases
url: http://sametmax.com/cases/
content:
<p>J&#8217;ai beaucoup voyagé. Vraiment beaucoup. Dans ma vie j&#8217;ai croisé :</p>
<p>Des racistes qui ont du cœurs<br />
Des libéralistes qui défendent des monopoles<br />
Des prostitués pudiques<br />
Des chasseurs bouddhistes<br />
Des femmes qui aiment se faire taper dessus<br />
Des pacifistes collectionneurs d&#8217;armes<br />
Des libristes qui ont des voitures électriques dernier cri<br />
Des communistes riches<br />
Des musulmans polythéistes<br />
Des geeks sportifs<br />
Des timides courageux<br />
Des obsédés sexuels fidèles<br />
Des végétariens violents<br />
Des homosexuels heureux d&#8217;être mariés à une femme<br />
Des enseignants incultes<br />
Des dirigeants qui ont conscience qu&#8217;ils ne savent pas ce qu&#8217;ils font<br />
Des adultes qui croient au Père Noël<br />
Des vierges avec des rides<br />
Des guérisseurs très malades<br />
Des stalkers adorables<br />
Des handicapés excellents grimpeurs de falaise<br />
Des transsexuels plus beaux que des femmes<br />
Des dealers qui ont une très bonne hygiène de vie<br />
Des plombiers chanteurs de rock<br />
Des écolos qui achètent du bio sur-emballé de plastique<br />
Des immigrés qui sont pour la fermeture des frontières<br />
Des israéliens et des palestiniens qui prennent l&#8217;apéro<br />
Des personnes brillantes qui sont dans des sectes<br />
Des sans-emplois qui travaillent beaucoup<br />
Des fumeurs de 60 ans qui ont des poumons immaculés<br />
Des anciens gros qui s&#8217;écartent car ils croient empêcher les gens de passer</p>
<p>Et bien d&#8217;autres choses pour lesquelles les mots n&#8217;ont aucun sens.</p>
<p><strong>Cases</strong>, <em>n.f. plur. </em>: délimiteurs artificiels dans lesquels le monde ne tient pas.</p>


feed_id: http://sametmax.com/?p=4107
title: Ordonner en Python
uri: Ordonner-en-Python
url: http://sametmax.com/ordonner-en-python/
content:
<p>Python possède une manière de mettre les choses dans l&#8217;ordre qui est à la fois simple et puissante.</p>
<h2>Tout est ordonnable</h2>
<p>Pour comprendre comment marche le tri en Python, il faut comprendre que presque tout en Python est ordonnable car comparable :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">1</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #808080; font-style: italic;"># les nombres sont comparables</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">1</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">0</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;a&quot;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #483d8b;">&quot;b&quot;</span> <span style="color: #808080; font-style: italic;"># les lettres, par ordre alphabetique</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">True</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #008000;">False</span> <span style="color: #808080; font-style: italic;"># les booléan (!)</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># les iterables comparés, élément par élément dans l'ordre</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># mais ils doivent être du même type</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: black;">&#123;</span><span style="color: #ff4500;">1</span>:<span style="color: #ff4500;">1</span><span style="color: black;">&#125;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: black;">&#123;</span><span style="color: #ff4500;">1</span>:<span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">0</span><span style="color: black;">&#125;</span> <span style="color: #808080; font-style: italic;"># les dictionnaires, par nombre d'éléments</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;a&quot;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">2</span> <span style="color: #808080; font-style: italic;"># si on mélange des types ça peut vide devenir bizarre</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> 1j <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span> <span style="color: #808080; font-style: italic;"># j'ai dis PRESQUE tout est ordonnable</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-11-ed3c013d3df8&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    1j <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span>
<span style="color: #008000;">TypeError</span>: no ordering relation <span style="color: #ff7700;font-weight:bold;">is</span> defined <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">complex</span> numbers</pre></div></div>

<p>C&#8217;est ce qu&#8217;on appelle l&#8217;ordre naturel des éléments. Quand il n&#8217;y a pas d&#8217;ordre naturel évident (et que ce n&#8217;est pas une opération explicitement interdite comme avec les complexes), Python va comparer l&#8217;id (imaginez l&#8217;adresse en mémoire):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> PersonnageDeLost<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
...     <span style="color: #ff7700;font-weight:bold;">pass</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> mort1 = PersonnageDeLost<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> mort2 = PersonnageDeLost<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> mort1 <span style="color: #66cc66;">&lt;</span> mort2
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>mort1<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># son id est plus petit, donc il est inférieur</span>
<span style="color: #ff4500;">39611408</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>mort2<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">41720976</span></pre></div></div>

<p>Mais on peut définir un ordre naturel pour un élément personnalisé en implémentant les méthodes suivantes:</p>
<ul>
<li><code>object.__lt__(self, other)</code></li>
<li><code>object.__le__(self, other)</code></li>
<li><code>object.__eq__(self, other)</code></li>
<li><code>object.__ne__(self, other)</code></li>
<li><code>object.__gt__(self, other)</code></li>
<li><code>object.__ge__(self, other)</code></li>
</ul>
<p>N&#8217;implémentez plus <code>__cmp__</code>, elle est dépréciée.</p>
<p>Par exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, erectopouvoir<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">erectopouvoir</span> = erectopouvoir
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__lt__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># on doit retourner un booléan qui confirme ou infirme </span>
        <span style="color: #808080; font-style: italic;"># l'opération &quot;lt&quot; (&quot;lower than&quot;, c'est à dire &quot;plus petit que&quot;)</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">erectopouvoir</span> <span style="color: #66cc66;">&lt;</span> other.<span style="color: black;">erectopouvoir</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__gt__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># on doit retourner un booléan qui confirme ou infirme </span>
        <span style="color: #808080; font-style: italic;"># l'opération &quot;gt&quot; (&quot;greater than&quot;, c'est à dire &quot;plus grand que&quot;)</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">erectopouvoir</span> <span style="color: #66cc66;">&gt;</span> other.<span style="color: black;">erectopouvoir</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># on peut faire la même chose pour les autres méthodes qui </span>
    <span style="color: #808080; font-style: italic;"># concernent les opérateurs &lt;=, &gt;=, == et !=</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Ryo Saeba'</span>, <span style="color: #ff4500;">99999</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Mamouth'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Ryo Saeba'</span>, <span style="color: #ff4500;">99999</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Mamouth'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">False</span></pre></div></div>

<h2>Ordonner une liste</h2>
<p>Une liste est ce qu&#8217;on ordonne le plus souvent. Elle possède pour cela une méthode <code>sort()</code> qui est la méthode de tri la plus rapide qui existe avec la lib standard.</p>
<p><code>sort()</code> trie une liste sur place (elle modifie donc la liste), et <strong>retourne None</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> l = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> res = l.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> res <span style="color: #808080; font-style: italic;"># n'assignez jamais le résultat de sort(), ça ne sert à rien !</span>
<span style="color: #008000;">None</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Les éléments sont triés dans leur ordre naturel automatiquement, <strong>du plus petit au plus grand</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> l = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l <span style="color: #808080; font-style: italic;"># ordonne sur le premier élément, puis le second si il y a égalité</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> persos = <span style="color: black;">&#91;</span>PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Ryo Saeba'</span>, <span style="color: #ff4500;">99999</span><span style="color: black;">&#41;</span>, PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Mamouth'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, PersonnageDeCityHunter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Kaori'</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> persos.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> perso <span style="color: #ff7700;font-weight:bold;">in</span> persos:
...     <span style="color: #ff7700;font-weight:bold;">print</span> perso.<span style="color: black;">nom</span>
...     
<span style="color: black;">Kaori</span>
Mamouth
Ryo Saeba</pre></div></div>

<p>On peut demander à inverser l&#8217;odre de tri en passant l&#8217;argument <code>reverse</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> l = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> l
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></pre></div></div>

<h2>Il n&#8217;y a pas que les listes dans la vie</h2>
<p>Tout itérable est ordonnable, et la fonction <code>sorted()</code> permet justement d&#8217;ordonner n&#8217;importe quel itérable de taille finie.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># une liste</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># un set</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># un tuple</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Un clavier azerty en vaut deux'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># une chaîne</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">' '</span>, <span style="color: #483d8b;">' '</span>, <span style="color: #483d8b;">' '</span>, <span style="color: #483d8b;">' '</span>, <span style="color: #483d8b;">' '</span>, <span style="color: #483d8b;">'U'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'c'</span>, <span style="color: #483d8b;">'d'</span>, <span style="color: #483d8b;">'e'</span>, <span style="color: #483d8b;">'e'</span>, <span style="color: #483d8b;">'e'</span>, <span style="color: #483d8b;">'e'</span>, <span style="color: #483d8b;">'i'</span>, <span style="color: #483d8b;">'l'</span>, <span style="color: #483d8b;">'n'</span>, <span style="color: #483d8b;">'n'</span>, <span style="color: #483d8b;">'r'</span>, <span style="color: #483d8b;">'r'</span>, <span style="color: #483d8b;">'t'</span>, <span style="color: #483d8b;">'t, '</span>u<span style="color: #483d8b;">', '</span>u<span style="color: #483d8b;">', '</span>v<span style="color: #483d8b;">', '</span>v<span style="color: #483d8b;">', '</span>x<span style="color: #483d8b;">', '</span>y<span style="color: #483d8b;">', '</span>z<span style="color: #483d8b;">']
&gt;&gt;&gt; sorted(open('</span>/etc/fstab<span style="color: #483d8b;">'))[:3] # un fichier
['</span><span style="color: #808080; font-style: italic;">#\n', '#\n', '# / was on /dev/sda5 during installation\n']</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span> <span style="color: #808080; font-style: italic;"># plus ou moins n'importe quoi</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">42</span>, <span style="color: #ff4500;">69</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">21</span>, <span style="color: #ff4500;">35</span>, <span style="color: #ff4500;">37</span>, <span style="color: #ff4500;">41</span>, <span style="color: #ff4500;">48</span>, <span style="color: #ff4500;">48</span>, <span style="color: #ff4500;">54</span>, <span style="color: #ff4500;">58</span>, <span style="color: #ff4500;">58</span>, <span style="color: #ff4500;">59</span>, <span style="color: #ff4500;">62</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">82</span>, <span style="color: #ff4500;">94</span><span style="color: black;">&#93;</span></pre></div></div>

<p><code>sort()</code> et <code>sorted()</code> <strong>acceptent toutes les deux les mêmes arguments</strong>. Ce que vous apprenez pour l&#8217;un vaut pour l&#8217;autre. La seul différence est que <code>sort()</code> retourne <code>None</code> et modifie sur place, tandis que <code>sorted()</code> retourne une nouvelle liste. <code>sorted()</code> est un peu moins performant.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></pre></div></div>

<h2>Tri personnalisé avec <code>key</code></h2>
<p>Parfois on a besoin de trier sur quelque chose de plus complexe qu&#8217;une lettre ou un chiffre. Par exemple, vous avez des scores dans un dictionnaires. Un dictionnaire n&#8217;est pas ordonné. Si vous imprimez un classement, il faut en faire une liste de tuples :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> scores = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'Robert'</span>: <span style="color: #ff4500;">2</span>, <span style="color: #483d8b;">'Roger'</span>: <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Gertrude'</span>: <span style="color: #ff4500;">4</span>, <span style="color: #483d8b;">'Cunegonde'</span>: <span style="color: #ff4500;">3</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> scores.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Gertrude'</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cunegonde'</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Robert'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Roger'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Et il faut maintenant ordonner ça sur le deuxième élément de chaque tuple : le score. Seulement si on appelle <code>sorted()</code>, il va trier sur l&#8217;ordre naturel, donc il va commencer par le premier élément, ça ne marchera pas :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>scores.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cunegonde'</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Gertrude'</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Robert'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Roger'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>C&#8217;est là qu&#8217;intervient le paramètre <code>key</code>. <code>key</code> est très particulier, c&#8217;est un paramètre qui attend qu&#8217;on lui passe un <a href="http://sametmax.com/quest-ce-quun-callback/">callback</a>, donc <code>key</code> attend qu&#8217;on lui passe <strong>une fonction</strong>. </p>
<p>Pas le résultat d&#8217;une fonction. La fonction elle même.</p>
<p>Cette fonction doit attendre en paramètre un élément, et en <strong>extraire la partie sur laquelle on veut trier</strong>.</p>
<p>Par exemple dans le cas des scores, on doit passer à <code>key</code> une fonction qui attend un tuple en paramètre, et retourne le score :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> get_score<span style="color: black;">&#40;</span>nom_et_score<span style="color: black;">&#41;</span>:
...     <span style="color: #ff7700;font-weight:bold;">return</span> nom_et_score<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># retourne le 2nd element du tuple</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>scores.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, key=get_score<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># on passe la fonction a key</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Roger'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Robert'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cunegonde'</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Gertrude'</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Et voilà, c&#8217;est trié dans le bon ordre car <code>sorted()</code> va utiliser <code>get_score()</code> pour récupérer la valeur de chaque élément un par un,  sur laquelle on va trier la liste (selon l&#8217;ordre naturel de cette valeur).</p>
<p>On peut utiliser <code>key</code> pour faire des choses beaucoup plus complexes, comme comparer sur des valeurs qui n&#8217;existent pas, mais que l&#8217;on calcule :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> carre<span style="color: black;">&#40;</span>val<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># on va ordonner par valeur de carré</span>
...     <span style="color: #ff7700;font-weight:bold;">return</span> val <span style="color: #66cc66;">*</span> val 
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>, key=carre<span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>, -<span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Ici, un carré est toujours positif, du coup on retrouve -1 et -2 devant 0, car leurs carrés 1 et 4 sont plus grands que le carré 0 de 0.</p>
<p>Ne vous embrouillez pas : la valeur retournée par <code>carre()</code> n&#8217;est pas MISE dans la liste, elle est juste utilisée pour choisir l&#8217;ordre d&#8217;un élément dans la liste.</p>
<p>On peut même faire des comparaisons très avancées, comme par exemple comparer sur plusieurs attributs d&#8217;un objet. Imaginez, je veux ordonner des objets voitures selon leur coût d&#8217;entretien d&#8217;abord, et ensuite par coût d&#8217;achat.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Voiture<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cout_entretien, cout_achat<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">cout_entretien</span> = cout_entretien
        <span style="color: #008000;">self</span>.<span style="color: black;">cout_achat</span> = cout_achat
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__repr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&lt;Voiture E-{} / A-{}&gt;&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cout_entretien</span>, <span style="color: #008000;">self</span>.<span style="color: black;">cout_achat</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> voitures = <span style="color: black;">&#91;</span>Voiture<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span>, <span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>, Voiture<span style="color: black;">&#40;</span><span style="color: #ff4500;">50000</span>, <span style="color: #ff4500;">10000</span><span style="color: black;">&#41;</span>, Voiture<span style="color: black;">&#40;</span><span style="color: #ff4500;">10000</span>, <span style="color: #ff4500;">60000</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> voitures
<span style="color: black;">&#91;</span><span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">50000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">60000</span><span style="color: #66cc66;">&gt;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> get_entretien_achat<span style="color: black;">&#40;</span>voiture<span style="color: black;">&#41;</span>: 
...         <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>voiture.<span style="color: black;">cout_entretien</span>, voiture.<span style="color: black;">cout_achat</span><span style="color: black;">&#41;</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>voitures, key=get_entretien_achat<span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">60000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">50000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span><span style="color: black;">&#93;</span></pre></div></div>

<p><code>get_entretien_achat()</code> retourne un tuple de deux valeurs. Python va donc ordonner sur ce tuple, dans l&#8217;odre naturel du tuple en prenant la première valeur comme point de comparaison (coût d&#8217;entretien), puis la seconde (coût d&#8217;achat) si les valeurs sont égales. </p>
<p>On peut donc comparer des objets arbitraires sur des critères arbitraires.</p>
<p>La plupart du temps, vous voudrez juste comparer sur un élément ou un attribut, donc dans ce cas le module <a href="http://sametmax.com/le-module-operator-en-python/">operator</a> (ou une <a href="http://sametmax.com/fonctions-anonymes-en-python-ou-lambda/">lambda</a>) est votre ami :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">operator</span> <span style="color: #ff7700;font-weight:bold;">import</span> attrgetter, itemgetter
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>voitures, key=attrgetter<span style="color: black;">&#40;</span><span style="color: #483d8b;">'cout_achat'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># ordonner par cout d'achat</span>
<span style="color: black;">&#91;</span><span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">50000</span> / A-<span style="color: #ff4500;">10000</span><span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>Voiture E-<span style="color: #ff4500;">10000</span> / A-<span style="color: #ff4500;">60000</span><span style="color: #66cc66;">&gt;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>scores.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, key=itemgetter<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># ordonner par score</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Roger'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Robert'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cunegonde'</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Gertrude'</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span>scores.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, key=itemgetter<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span> 
<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Gertrude'</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cunegonde'</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Robert'</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'Roger'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Pour finir, je vous invite à lire l&#8217;<a href="http://sametmax.com/heapq-le-module-python-incompris/">article sur le module heapq</a> qui lui permet de faire des tris sur des flux de données sans taille définie.</p>


feed_id: http://sametmax.com/?p=4238
title: A l’intérieur de mon .bashrc
uri: A-l-intérieur-de-mon-bashrc
url: http://sametmax.com/a-linterieur-de-mon-bashrc/
content:
<p>Généralement montrer son <em>.bashrc</em> donne rapidement lieu dans les comments à un concours de celui qui a la plus longue (jusqu&#8217;à ce qu&#8217;arrive un utilisateur de zsh, et alors commence le concours de celui qui pisse le plus loin). Mais bon, aujourd&#8217;hui j&#8217;ai la flemme d&#8217;écrire un article complet.</p>
<p>Rappel : le <em>.bashrc</em> c&#8217;est le fichier qui est automatiquement chargé au démarrage du shell bash, le shell par défaut sur la plupart des Unix incluant Mac et Ubuntu.</p>
<p>Donc si vous voulez avoir une expérience de travail personnalisée dans votre terminal, c&#8217;est dans ce fichier que ça se passe.</p>
<p>Personnellement, j&#8217;ai tout le bordel que met Ubuntu par défaut (notamment les trucs avec les autocomplétions de partout). En en prime je rajoute :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># un raccourcis pour lancer redis car je le met sur off par défaut met je le </span>
<span style="color: #666666; font-style: italic;"># lance souvent</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> redis <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;/var/run/redis/redis-server.pid&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #c20cb9; font-weight: bold;">sudo</span> service redis-server start
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># un tas de raccourcis type</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> projet_django <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    workon projet_django;
    <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sam<span style="color: #000000; font-weight: bold;">/</span>Work<span style="color: #000000; font-weight: bold;">/</span>projet_django<span style="color: #000000; font-weight: bold;">/</span>repo<span style="color: #000000; font-weight: bold;">/</span>projet_django;
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$#</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        .<span style="color: #000000; font-weight: bold;">/</span>manage.py $<span style="color: #000000; font-weight: bold;">@</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">sb</span>=<span style="color: #ff0000;">'projet_django'</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># CF: http://sametmax.com/un-alias-bash-pour-django-virtualenv-dont-je-ne-peux-plus-me-passer/</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># fonction fétiche de bourrin</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> killbill <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #007800;">BAK</span>=<span style="color: #007800;">$IFS</span>
    <span style="color: #007800;">IFS</span>=$<span style="color: #ff0000;">'\n'</span>
    <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">id</span> <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ps</span> aux <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-P</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;grep&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{printf $2&quot; &quot;; for (i=11; i&lt;NF; i++) printf $i&quot; &quot;; print $NF}'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>; <span style="color: #000000; font-weight: bold;">do</span> 
        <span style="color: #007800;">service</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$id</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #660033;">-f</span> <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$2</span> == <span style="color: #ff0000;">&quot;-t&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
            <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$service</span> <span style="color: #000000; font-weight: bold;">\&quot;</span>$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$id</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span>-<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">\&quot;</span> <span style="color: #ff0000;">&quot;would be killed&quot;</span>
        <span style="color: #000000; font-weight: bold;">else</span>
&nbsp;
            <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$service</span> <span style="color: #000000; font-weight: bold;">\&quot;</span>$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$id</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span>-<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">\&quot;</span> <span style="color: #ff0000;">&quot;killed&quot;</span>
            <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-9</span> <span style="color: #007800;">$service</span>
        <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #000000; font-weight: bold;">done</span>
    <span style="color: #007800;">IFS</span>=<span style="color: #007800;">$BAK</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># que j'ai un peu amélioré depuis http://sametmax.com/tu-vas-crever-oui/</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># une fonction pour commiter rapidement </span>
<span style="color: #000000; font-weight: bold;">function</span> commit <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #c20cb9; font-weight: bold;">git</span> commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;<span style="color: #780078;">`echo &quot;$*&quot; | sed -e 's/^./\U&amp;\E/g'`</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">co</span>=commit;
&nbsp;
<span style="color: #666666; font-style: italic;"># en gros on tappe &quot;co message de commit&quot;. Sans guillement, sans rien.</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># des completions pour manage.py et git</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sam<span style="color: #000000; font-weight: bold;">/</span>.django_bash_completion
<span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sam<span style="color: #000000; font-weight: bold;">/</span>.git-completion.bash
&nbsp;
<span style="color: #666666; font-style: italic;"># activation du cache de pip pour éviter de télécharger 20 fois la même lib</span>
&nbsp;
<span style="color: #007800;">PIP_DOWNLOAD_CACHE</span>=<span style="color: #ff0000;">'/opt/pip-cache'</span>;
<span style="color: #7a0874; font-weight: bold;">export</span> PIP_DOWNLOAD_CACHE;
&nbsp;
<span style="color: #666666; font-style: italic;"># un super outil pour un git plus user friendly</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-s</span> <span style="color: #ff0000;">&quot;/home/sam/.scm_breeze/scm_breeze.sh&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #ff0000;">&quot;/home/sam/.scm_breeze/scm_breeze.sh&quot;</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">c</span>=<span style="color: #ff0000;">&quot;git_index&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># j'en avais parlé ici : http://sametmax.com/scm-breeze-facilite-la-selection-de-vos-fichiers-a-commiter-sous-git-avec/</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># un prompt personalisé tout en couleur</span>
<span style="color: #666666; font-style: italic;"># formaté comme ça: [nom du virtualenv] sam ~/path (branche git) $</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">source</span> ~<span style="color: #000000; font-weight: bold;">/</span>.prompt.bash
&nbsp;
<span style="color: #666666; font-style: italic;"># le fichier ressemble à ça : http://0bin.net/paste/d103a91dc41818462da0c8468ddddf4141f2efd6#dKr6qWHfAVZsSnOQ7fA4pPQ3Dquhz0Oj1b2OF8xw6vA=</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># la configuration de virtualenv wrapper </span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">WORKON_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sam<span style="color: #000000; font-weight: bold;">/</span>.virtualenvs
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #007800;">$WORKON_HOME</span>
<span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>virtualenvwrapper.sh
&nbsp;
<span style="color: #666666; font-style: italic;"># plus de détails ici : http://sametmax.com/les-environnement-virtuels-python-virtualenv-et-virtualenvwrapper/</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># j'ai récément succombé aux sirène du virtualenv automatique</span>
<span style="color: #666666; font-style: italic;"># j'avais beaucoup d'a priori (particulirement écraser la commande CD)</span>
<span style="color: #666666; font-style: italic;"># mais à l'usage, c'est pratique</span>
has_virtualenv<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> .venv <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        workon <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> .venv<span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
venv_cd <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">builtin</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;$@&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> has_virtualenv
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">cd</span>=<span style="color: #ff0000;">&quot;venv_cd&quot;</span>
has_virtualenv
&nbsp;
<span style="color: #666666; font-style: italic;"># en gros ça m'active un virtualenv si il y a un fichier .venv avec un nom</span>
<span style="color: #666666; font-style: italic;"># de virtualenv dedans dans le dossier courrant</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># je vous en parlais récement (http://sametmax.com/configurer-votre-terminal-pour-quil-vous-notifie-de-la-fin-dune-commande-longue/)</span>
<span style="color: #666666; font-style: italic;"># c'est pour avoir une notifi à la fin des commandes longues </span>
notify_when_long_running_commands_finish_install
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># ca c'est un truc de feignasse car je me souviens jamais comment extraire </span>
<span style="color: #666666; font-style: italic;"># en ligne de commande tel ou tel format</span>
&nbsp;
extract <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">in</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.7z<span style="color: #7a0874; font-weight: bold;">&#41;</span> 7z x <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.lzma<span style="color: #7a0874; font-weight: bold;">&#41;</span> unlzma <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.rar<span style="color: #7a0874; font-weight: bold;">&#41;</span> unrar x <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tar<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tar.bz2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.bz2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">bunzip2</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tar.gz<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.gz<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">gunzip</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tar.xz<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> Jxvf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.xz<span style="color: #7a0874; font-weight: bold;">&#41;</span> xz <span style="color: #660033;">-d</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tbz2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.tgz<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.zip<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.Z<span style="color: #7a0874; font-weight: bold;">&#41;</span> uncompress <span style="color: #000000; font-weight: bold;">;;</span>
            <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;don't know how to extract '$1'...&quot;</span> <span style="color: #000000; font-weight: bold;">;;</span>
        <span style="color: #000000; font-weight: bold;">esac</span>
    <span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Error: '$1' is not a valid file!&quot;</span>
        <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># ça date de http://sametmax.com/decompresser-sous-linux-en-ligne-de-commande/</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># et quelques alias pour des tâches de tous les jours</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">alias</span> ..=<span style="color: #ff0000;">'cd ..'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> ...=<span style="color: #ff0000;">'cd ../../'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> ....=<span style="color: #ff0000;">'cd ../../../'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> .....=<span style="color: #ff0000;">'cd ../../../../'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> ......=<span style="color: #ff0000;">'cd ../../../../../'</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">process</span>=<span style="color: #ff0000;">'ps aux | grep'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">serve</span>=<span style="color: #ff0000;">&quot;python -c 'import SimpleHTTPServer; SimpleHTTPServer.test()'&quot;</span></pre></div></div>


feed_id: http://sametmax.com/?p=4241
title: Git next et Git prev, pour vos tutos
uri: Git-next-et-Git-prev-pour-vos-tutos
url: http://sametmax.com/git-next-et-git-prev-pour-vos-tutos/
content:
<p>Il peut être pratique de fournir un repository Git plein de code à télécharger dans un tuto. Parfois le code a plusieurs états, comme autant d&#8217;étapes que vous voulez que le lecteur découvre au fur et à mesure.</p>
<p>Voici un petit alias Git qui permet de faire exactement cela. Mettez dans votre fichier <em>~/.gitconfig</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>alias<span style="">&#93;</span></span>
    <span style="color: #000099;">prev</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> checkout HEAD^1</span>
    <span style="color: #000099;">next</span> <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;!sh -c 'git log --reverse --pretty=%H master | awk \&quot;</span>/$<span style="">&#40;</span>git rev-parse HEAD<span style="">&#41;</span>/<span style="">&#123;</span>getline<span style="color: #666666; font-style: italic;">;print}\&quot; | xargs git checkout'&quot;</span></pre></div></div>

<p>Et votre lecteur pourra juste faire :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> next
<span style="color: #c20cb9; font-weight: bold;">git</span> prev</pre></div></div>

<p>Pour passer au commit suivant ou précédent dans votre repo, comme un wizard. Vous pouvez alors dans votre tuto parler du code dans un état donné, puis lui demander de faire <code>git next</code>, puis parler du nouvel état du code, etc.</p>


feed_id: http://sametmax.com/?p=4254
title: 129 drafts
uri: 129-drafts
url: http://sametmax.com/129-drafts/
content:
<p>Vraiment je ne pige pas les gens qui ont l&#8217;angoisse de la page blanche.</p>
<p>Quand je dis &#8220;j&#8217;ai pas d&#8217;inspi&#8221;, je mens. En fait soit j&#8217;ai pas la motiv, soit tous les sujets que j&#8217;ai sous la main ne me donnent pas envie, soit j&#8217;ai pas le temps, soit je suis fatigué&#8230;</p>
<p>Mais alors être en panne d&#8217;idées, je vois pas comment c&#8217;est possible.</p>
<p>Notre cerveau est une machine à idées. Pour pratiquer régulièrement la méditation, je peux vous dire que se plonger dans un état où on n&#8217;a pas une pensée qui se balade est un putain de challenge.</p>
<p>Ce matin je me demandais &#8220;bon, qu&#8217;allons nous écrire aujourd&#8217;hui. Hum moui&#8230;&#8221;</p>
<p>Je regarde le dossier <em>drafts</em> du blog; c&#8217;est le dossier qui contient tous les articles amorcés, les idées jetées, les titres racoleurs qu&#8217;on vous réserve, etc. </p>
<p>129.</p>
<p>129 articles qu&#8217;on a pas encore écrit. Et sans se forcer. Ce n&#8217;est pas comme si on se poussait à chercher tous les trucs possibles sur quoi écrire (exercice intéressant mais qui résulte avec un énorme tas de merde).</p>
<p>Si vous vous lancez dans un blog et que vous galérez à trouver sur quoi écrire : changez de sujet (il n&#8217;y a plus rien d&#8217;intéressant pour vous à dire sur la question) ou allez faire un tour dehors.</p>


feed_id: http://sametmax.com/?p=1219
title: Deviner qui a la plus grosse
uri: Deviner-qui-a-la-plus-grosse
url: http://sametmax.com/deviner-qui-a-la-plus-grosse/
content:
<p>Il est beau, intelligent, riche et visiblement il intéresse beaucoup la meuf que vous avez essayé de chopé il y a deux minutes. Il ne reste plus qu&#8217;une chose qui puisse vous consoler, qu&#8217;en fait il ait une toute petite bite.</p>
<p>Mais glisser ça dans la conversation est hasardeux. Certains ont mis aux point différentes stratégies basées sur des concours de boissons ou de pipi dans la neige, voire des questions sur le modèle de leur automobile.</p>
<p>Mais il y a beaucoup mieux : la science, messieurs !</p>
<h2>Sortez la calculette</h2>
<p>En divisant la taille de l&#8217;index par celle de l&#8217;annulaire (sur la main droite), on obtient l&#8217;indice de Manning, qui est un indicateur de l&#8217;exposition aux hormones durant la grossesse.</p>
<p>Plus l&#8217;indice est proche de 1, plus la personne a des chances d&#8217;être une femme. Mais comme vous l&#8217;avez de visu cette information n&#8217;est pas très utile pour vous.</p>
<p>Plus l&#8217;indice est bas (0.9x, avec x de plus en plus petit), plus la bite a des chances d&#8217;être grosse (et le mec d&#8217;être atteint d&#8217;autisme ou du syndrome d&#8217;Asperger, mais on va pas chipoter).</p>
<p>En gros, plus cette distance est grande :</p>
<div id="attachment_4265" class="wp-caption aligncenter" style="width: 424px"><a href="http://sametmax.com/wp-content/uploads/2013/01/distance.png"><img class=" wp-image-4265 " title="Dessinée rien que pour vous avec inkscape" src="http://sametmax.com/wp-content/uploads/2013/01/distance.png" alt="Comment calculer l'indice de manning" width="414" height="541" /></a><p class="wp-caption-text">Dessinée rien que pour vous avec inkscape</p></div>
<p>&nbsp;</p>
<p>Plus le sboob à des chances d&#8217;être grand.</p>
<p>Moi j&#8217;ai l&#8217;annulaire plus petit que l&#8217;index. Je suis pas dans la merde.</p>


feed_id: http://sametmax.com/?p=4275
title: Une journée dans un FKK (maison close Allemande)
uri: Une-journée-dans-un-FKK-(maison-close-Allemande)
url: http://sametmax.com/une-journee-dans-un-fkk-maison-close-allemande/
content:
<p>FKK : Frei-Körper-Kultur (FKK, culture du corps libre) sert à la base à désigner le naturisme et pour une raison que je j&#8217;ignore désigne actuellement les maisons closes chez nos chers voisins les Allemands.</p>
<div id="attachment_4285" class="wp-caption aligncenter" style="width: 522px"><img class=" wp-image-4285 " title="Un FKK vu de dehors, ça impresionne..." src="http://sametmax.com/wp-content/uploads/2013/01/post-26108-0-85623000-1345365838_thumb.jpg" alt="" width="512" height="337" /><p class="wp-caption-text">Vu de dehors, ça impresionne...</p></div>
<p><strong>10h00:</strong></p>
<p>Ouverture du FKK. Nous arrivons dans une immense propriété du style de celles que l&#8217;on voit dans les films pornos américains de bonne facture. Il fait frais dehors, la rosé perle encore sur les roses. A l&#8217;entrée un videur nous ouvre et nous souhaite la bienvenue en anglais puis nous dirige vers la caisse où trône une femme qui nous indique le tarif. 50€ la journée, repas compris.<br />
Elle nous remet ensuite un peignoir blanc, des sandales,  un bracelet avec une clef et nous envoit vers les vestiaires. Mon regard croise au loin quelques magnifiques créatures ayant pour seul habit un bikini et des talons aiguilles.<br />
Les vestiaires communs ainsi que les douches sont d&#8217;une propreté étonnante, il fait chaud, on se déshabille, on prend une douche et on enfile notre peignoir, nous voilà des oursons (nom donné aux clients des fkk à cause de leur peignoir blanc), direction le bar.<br />
La Villa est immense, des couloirs menant d&#8217;une pièce à une autre, un grand salon donnant sur la piscine extérieure. Un gars là sur un canapé lit son journal, visiblement paisible. Une douce musique flotte dans l&#8217;air&#8230;</p>
<p>&nbsp;</p>
<div id="attachment_4286" class="wp-caption aligncenter" style="width: 490px"><img class=" wp-image-4286 " title="Ambiance..." src="http://sametmax.com/wp-content/uploads/2013/01/FKK-Club-Dolce-Vita-3.jpg" alt="" width="480" height="320" /><p class="wp-caption-text">Ambiance...</p></div>
<p><strong>11h00:</strong></p>
<p>Il n&#8217;y a pas foule, quelques filles au bar, on demande où est le reste au barman: &#8220;Dehors en train de prendre le soleil, ou sur la piste de dance dans l&#8217;autre aile de la villa&#8221;.<br />
On commande une bière pour se chauffer un peu, attaquer si tôt c&#8217;est pas toujours simple. Au moment de régler on nous dit que c&#8217;est compris dans les 50€, bière illimitée, café, pommes et bien sur nourriture&#8230; Alors si c&#8217;est open bar&#8230;</p>
<p><strong>12h00:</strong></p>
<p>Quelques bières dans le nez on se sent mieux, on est sur la terrasse, le soleil nous innonde de chaleur, les filles sont là, toutes en bikinis (il y en a une qui ressemble à Carla-Bruni, ce qui soulève quelques blagues). Il fait trop froid pour piquer une tête alors on se dore la pillule et on observe méticulleusement notre proie.<br />
Pendant ce temps le buffet à été mis en place, tel des nantis les petits oursons se dirigent vers la salle afin de se restaurer, j&#8217;ai mieux manger dans ce buffet qu&#8217;au  Fouquet&#8217;s de la côte d&#8217;azur, c&#8217;est vous dire.</p>
<p>&nbsp;</p>
<div id="attachment_4287" class="wp-caption aligncenter" style="width: 490px"><img class=" wp-image-4287    " title="Un petit massage ?" src="http://sametmax.com/wp-content/uploads/2013/01/room-fkk-mainhattan.jpg" alt="" width="480" height="319" /><p class="wp-caption-text">Un petit massage ?</p></div>
<p><strong>13h00:</strong></p>
<p>Après avoir un peu digéré on repart vers le bar prendre une bière et on commence notre tour d&#8217;inspection en terrasse.<br />
Une succulente blonde m&#8217;aggripe,  elle a le corps bien bronzé, la crème solaire donnait un aspect luisant à sa peau, ses formes étaient misent en valeur par des chaussures à talons hauts dont les strass étincellaientt sous les rayons du soleil. Je mis ma main autour de sa taille comme pour la rapprocher de moi afin de lui sussurer à l&#8217;oreille que j&#8217;appréciais particulièrement ses chaussures.<br />
Après quelques échanges de compliments, je laisse mes amis là et je parts avec la belle dans le kino (la plupart des FKK possèdent un cinéma d&#8217;une 20aine de places où ils se passent plein de choses&#8230;). On s&#8217;assoit et elle commence à me carresser, tout en se mettant à 4 pattes, les fesses bien en l&#8217;air. Je ne suis même pas le film porno qui passe tellement ses courbes m&#8217;hypnotise. Je comprends à présent l&#8217;utilité du peignoir, je suis nu en dessous et en un tour de main me voilà opérationel. Cette superbe créature voyant mon excitation ne pue s&#8217;empêcher de mettre en bouche mon sexe. Je carressais sa peau douce et ferme pendant qu&#8217;elle promenait sa langue le long de ma verge tout en me regardant dans les yeux.<br />
On décide alors de continuer en chambre pour approfondir le sujet.<br />
On passe prendre une serviette à l&#8217;accueil et une clef. La chambre est grande, bien éclairée et un grand mirroir est fixé en face du lit. Je demande à la belle de garder ses chaussures car c&#8217;est un de mes phantasmes. Elle s&#8217;exécute et je l&#8217;allonge sur le lit, je lui propose un massage (comme à toutes d&#8217;ailleurs) qu&#8217;elle accepte volontier. La tension qui était redescendue entre le kino et la chambre est à présent revenue. Un corps superbe dans une chambre superbe. Je laisse glisser mes doigts le long de son dos pour m&#8217;attarder au niveau de ses fesses. Elle flatte mon ego en lâchant un : &#8220;Vous les français vous êtes tous de tendres romantiques.&#8221; Elle écarta très légèrement les jambes, fit quelques mouvements de bassin pour se caler confortablement sur le lit et mit un oreiller derrière la nuque. Sans difficulté ma langue trouva la tête d’épingle qu’elle cherchait et soigneusement, méthodiquement pour ne rien oublier explora la totalité de cette douceur. Quelques soubresauts trahissaient la réceptivité de ma partenaire. Mes mains ne m’obéissaient plus, elles s’enivraient à parcourir cette peau au grain si doux.<br />
Je m&#8217;allonge à côté d&#8217;elle et tout doucement elle m’enfile la protection et me chevauche. Dans cette position, le buste bien droit et redressé, ses seins sont encore plus beaux et majestueux, je les caresse, les malaxe, les embrasse, les léche… Ils sont tout à la fois : gros, naturels, parfaitement fermes, ils ont la forme de la perfection. Bordel c’est donc vrai, Dieu existe!<br />
L&#8217;heure passe et il faut finir, Le paradis est timé ! Je lui demande gentillement si je peux venir entre ses seins et elle accepte tout en me regardant droit dans les yeux. Nous redescendons et elle me suis aux vestiaires où je lui règle sa prestation, 50€. Après l&#8217;avoir remercié elle me gratifie d&#8217;un baiser tendre et langoureux. Je retourne en salle où je rejoins mes oursons laissés à leurs activités&#8230;</p>
<p><strong>15h00:</strong></p>
<p>La session d&#8217;avant m&#8217;ayant un peu fatigué je decide de me poser au salon, c&#8217;est calme, il y fait bon et je peux matter quelques filles superbes défiler devant moi.  Je suis calme, un sourire béa au coin de la bouche. Je bois un café, je suis bien.</p>
<p><strong>17h00:</strong></p>
<p>je me remets de ma petite sieste, un de mes amis me rejoignent et me propose d&#8217;aller boire un verre, c&#8217;est bientôt l&#8217;heure de l&#8217;apéro il va falloir repartir. Nous enchainons les bières, on rejoins d&#8217;autres potes qui étaient partis en chambre durant ce temps, on se raconte nos histoires salaces, nos performances, les filles qui valent le coup ou pas, l&#8217;heure tourne.</p>
<p><strong>19h00:</strong></p>
<p>C&#8217;est un peu le bordel, quelques potes sont en chambres et les autres attendent, on voudrait être synchro pour attaquer la soirée alors on patiente, au bar encore, et oui c&#8217;est gratuit alors&#8230;</p>
<p><strong>20h00:</strong></p>
<p>Tout le monde est présent, la nuit est tombée, l&#8217;ambiance est sympa, les filles sont de plus en plus belles au fur et à mesure des bières. Le buffet est servit, on mange, on boit, on rigole avec les filles avec qui on a sympatisé dans la journée. C&#8217;est très classe, très propre, Toulouse -Lautrec aurait adoré. Tout le monde est chaud, c&#8217;est comme être en boîte mais avec des bombes atomiques qui vous mettent pas de rateaux parceque vous leur avez pas payé de bouteille de champagne. J&#8217;enchaîne une deuxième oursonne que j&#8217;avais repéré dans l&#8217;après-midi, mes accus sont rechargés je donne le <strong>MAX</strong>imum. Inutile de vous faire un dessin c&#8217;est l&#8217;orgie.</p>
<p><strong>22h00:</strong><br />
On est sur le rotules, présents sur le terrain depuis 10h00 du matin ça use, certains en sont à leur 4ème session. Là surprise! du ravitaillon, c&#8217;est le buffet de 22h00, pizzas, jus de fruit, etc nous requinque, les plus courageux remonterons avec une créature de rêve les autres se réserverons pour le FKK du lendemain.</p>
<p><strong>01h00:<br />
</strong>C&#8217;est l&#8217;heure de partir, pas de baguarre, des sourrires toute la journée, des gens très sympathiques venus passer du bon temps. Des filles superbes et pas bêtes, certaines parlent 4 langues et on un sens de la répartie simplement formidable. Certains oursons seront tombés amoureux. Le lit nous appelle,  nous nous empressons de rejoindre l&#8217;hotel et nous nous couchons la tête pleine de rêves érotiques, demain on recommence&#8230;</p>
<p>&nbsp;</p>
<p>PS: Aucune oursonne n&#8217;a été blessée lors du tournage de ce reportage.<br />
NB: J&#8217;ai légèrement édulcoré le récit et mélangé 2 journées passées dans 2 FKK différents mais ça aurait pu se passer en seule journée sans problème, les horaires sont asser réalistes. J&#8217;y retourne en Avril.<br />
NB bis: Ma mère n&#8217;a plus aucun espoir de me remettre dans le droit chemin, vous savez, femme &gt; enfants &gt; divorce &gt; pension&#8230;</p>


feed_id: http://sametmax.com/?p=4292
uri: 2013-01-27-Le-guide-ultime-et-définitif-sur-la-programmation-orientée-objet-en
title:
Le guide ultime et définitif sur la programmation orientée objet en Python à l’usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 3.

url:
http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-3/

content:
<p>Prérequis :</p>
<ul>
<li>Avoir lu la <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-2/">partie 2</a></li>
<li>Comprendre la notion de <a href="http://sametmax.com/valeurs-et-references-en-python/">référence</a>.</li>
</ul>
<p>Nous avons vu les attributs de classe et les propriétés, mais de manière très rudimentaire. Il y a beaucoup de choses à savoir sur la question.</p>
<h2>Attribut de classe, la totale</h2>
<p>Nous avons vu qu&#8217;un attribut de classe était accessible par la classe, sans instance :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> TrueLies:
...
...         <span style="color: black;">attribut_de_classe</span> = <span style="color: #483d8b;">'valeur'</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> TrueLies.<span style="color: black;">attribut_de_classe</span>
valeur</pre></div></div>

<p>Mais également par une instance :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">attribut_de_classe</span>
valeur</pre></div></div>

<p>C&#8217;est simple et direct. Il n&#8217;y a pas de <code>public static virtuel neconceptuel</code> à mettre devant comme dans certains langages trop cafféinés.</p>
<p>Ce qu&#8217;on a pas vu par contre, c&#8217;est ce qui arrive si on modifie la valeur de ces attributs.</p>
<p>Pour faire simple :</p>
<ul>
<li>Si je modifie l&#8217;attribut au niveau de l&#8217;instance, seule l&#8217;instance voit les modifications.</li>
<li>Si je modifie l&#8217;attribut au niveau de la classe, la classe et toutes les instances crées après ont la nouvelle valeur.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> instance = TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> instance.<span style="color: black;">attribut_de_classe</span> = <span style="color: #483d8b;">'nouvelle valeur'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> instance.<span style="color: black;">attribut_de_classe</span>
nouvelle valeur
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> TrueLies.<span style="color: black;">attribut_de_classe</span> <span style="color: #808080; font-style: italic;"># ça ne change rien pour la classe</span>
valeur
<span style="color: #66cc66;">&gt;&gt;&gt;</span> TrueLies.<span style="color: black;">attribut_de_classe</span> = <span style="color: #483d8b;">'encore une nouvelle valeur'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> TrueLies.<span style="color: black;">attribut_de_classe</span>
encore une nouvelle valeur
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> instance.<span style="color: black;">attribut_de_classe</span> <span style="color: #808080; font-style: italic;"># ça ne change rien pour cette instance</span>
nouvelle valeur
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">attribut_de_classe</span> <span style="color: #808080; font-style: italic;"># mais pour une nouvelle oui</span>
encore une nouvelle valeur</pre></div></div>

<p>Comme <code>self</code> est l&#8217;instance en cours, vous pouvez remplacer <code>instance</code> par <code>self</code> dans l&#8217;exemple ci-dessus (dans une méthode bien sûr, pas dans le shell), ça marche pareil.</p>
<p>Vu comme ça, ça à l&#8217;air d&#8217;être super pour donner une valeur par défaut à des attributs.</p>
<p>C&#8217;est une mauvaise idée.</p>
<p>En effet, les attributs de classes sont initialisés une seule fois, à la première lecture du code par Python. Pour les objets immutables comme les strings ou les int, on s&#8217;en branle. Mais pour les objets mutables comme les dicos ou les listes, c&#8217;est la merde.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> TrueLies:
...
...         <span style="color: black;">attribut_de_classe</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># mettons une liste ici</span>
...
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_qui_vole_le_travail_des_francais = TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> etranger_qui_vole_le_travail_des_francais = TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>On a donc deux instances de <code>TrueLies</code>. A priori, on a aussi deux valeurs de <code>attribut_de_classe</code>, une pour chaque instance ?</p>
<div id="attachment_4294" class="wp-caption aligncenter" style="width: 360px"><a href="http://sametmax.com/wp-content/uploads/2013/01/Norman350.jpg"><img src="http://sametmax.com/wp-content/uploads/2013/01/Norman350.jpg" alt="Des faux seins sur un FAUX de norman fait des vidéos" title="Norman va bientôt faire un film avec les robins des bois au fait" width="350" height="248" class="size-full wp-image-4294" /></a><p class="wp-caption-text">Norman va bientôt faire un film avec les robins des bois au fait</p></div>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>flim_qui_vole_le_travail_des_francais.<span style="color: black;">attribut_de_classe</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">28992072</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>flim_pas_sur_le_cyclimse.<span style="color: black;">attribut_de_classe</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">28992072</span></pre></div></div>

<p>Comme vous pouvez le voir c&#8217;est le même id. <code>attribut_de_classe</code> est la même chose, car Python initialise <code>attribut_de_classe</code> une seule fois pour toute la session. Les deux instances ont donc un attribut qui contient une référence (puisque TOUT est référence en Python) qui pointe sur la même liste.</p>
<p>Dans les fait, ça veut dire que si on modifie l&#8217;un, ben forcément la modification est visible de l&#8217;autre côté aussi :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_qui_vole_le_travail_des_francais.<span style="color: black;">attribut_de_classe</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_pas_sur_le_cyclimse.<span style="color: black;">attribut_de_classe</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></pre></div></div>

<p>C&#8217;est rarement ce qu&#8217;on veut.</p>
<p>Donc ne donnez pas de valeur par défaut dans les attributs de classe. Faites ça avec <code>__init__</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> TrueLies:
...
...         <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
...
...                 <span style="color: #008000;">self</span>.<span style="color: black;">attribut_tres_classe</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_qui_vole_le_travail_des_francais = TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> etranger_qui_vole_le_travail_des_francais = TrueLies<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_pas_sur_le_cyclimse.<span style="color: black;">attribut_tres_classe</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_pas_sur_le_cyclimse.<span style="color: black;">attribut_tres_classe</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> flim_qui_vole_le_travail_des_francais.<span style="color: black;">attribut_tres_classe</span>
<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Le comportement attendu est le bon ici.</p>
<h2>Ok, mais alors ils servent à quoi ces attributs à deux cents, là, cousin ?</h2>
<p>- Et ben wesh, tu vois, ils servent à stocker les constantes et le cache.</p>
<p>- Ouais quand j&#8217;ai constamment du stock j&#8217;ai du cash, man.</p>
<p>- héééééééééééé&#8230; xactement.</p>
<p>Donc, d&#8217;abord, on met les pseudo constantes en attributs de classe. Je dis pseudo car il n&#8217;existe pas de constantes en Python. On parle de constante quand une variable est écrite toute en majuscule, une convention pour dire &#8220;le programme ne change jamais la valeur de cette variable (et t&#8217;as pas intérêt à la changer, pigé ?)&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> TrueLies:
&nbsp;
    NOMBRE_DE_BALLES_DANS_LE_CHARGEUR = <span style="color: #ff4500;">10000</span></pre></div></div>

<p>On peut être certain que Schwarzy ne recharge jamais (y a que Thierry Lhermitte qui ferait un truc aussi ringard). Donc le nombre de balles dans le chargeur ne varie pas. On le met comme attribut de classe. C&#8217;est essentiellement à titre informatif. Pour nous ça change rien, mais pour quelqu&#8217;un qui va utiliser le code, il sait qu&#8217;il peut chercher toutes les constantes liées à <code>TrueLies</code> en faisant <code>TrueLies.LES_TRUCS_EN_MAJUSCULES</code>.</p>
<p>C&#8217;est l&#8217;usage le plus courant.</p>
<p>On peut aussi utiliser les attributs de classes pour créer une API déclarative, comme le fait <a href="https://docs.djangoproject.com/en/dev/topics/db/models/">l&#8217;ORM de Django</a>. Mais bon, c&#8217;est mega advanced, donc je mets de côté le how to. Le jour où vous coderez un truc comme ça, vous lirez pas un article pour débutant.</p>
<p>Enfin on peut utiliser les attributs de classe pour partager des données entre les instances. Par exemple du cache.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> TrueFalseSomeWhatLiesMaybeWhoKnows :
&nbsp;
    _cache = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> calculer_le_nombre_de_balles_a_la_seconde<span style="color: black;">&#40;</span>scene<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># si y a rien dans le cache, on fait le calcul et on le met dans le cache</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> scene <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>._cache :
&nbsp;
            <span style="color: #008000;">self</span>._cache<span style="color: black;">&#91;</span>scene<span style="color: black;">&#93;</span> = <span style="color: #808080; font-style: italic;"># mettre un calcul bien compliqué ici</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># on retourne le contenu du cache</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._cache<span style="color: black;">&#91;</span>scene<span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> TrueFalseSomeWhatLiesMaybeWhoKnows<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">calculer_le_nombre_de_balles_a_la_seconde</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">56586586</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> TrueFalseSomeWhatLiesMaybeWhoKnows<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">calculer_le_nombre_de_balles_a_la_seconde</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">56586586</span></pre></div></div>

<p>Le premier appel va faire le calcul. Mais pas le second, car le résultat a été stocké dans le dictionnaire qui est au niveau de la classe (et donc chaque nouvelle instance a une référence vers ce dictionnaire) et peut donc être réutilisé.</p>
<p>Vous noterez qu&#8217;on a appelé la variable <code>_cache</code> et pas <code>cache</code>. C&#8217;est encore une convention. Ça signifie, &#8220;cette variable est utilisée en interne, t&#8217;as pas à savoir ce qu&#8217;elle fait, imagine que c&#8217;est privé. Circulez, y a rien à voir.&#8221; Les outils de complétion de code masquent ces variables par défaut.</p>
<p>Pour la culture, sachez que nommer ses variables <code>__nom</code> les rend &#8220;privées&#8221; en Python. Néanmoins cette fonctionnalité est facilement contournable, et très peu appréciée dans la communauté, donc évitez-la.</p>
<h2>Et puis il y a les méthodes statiques aussi</h2>
<p>On a vu les méthodes de classe, qui sont, comme les attributs de classe, des méthodes qui n&#8217;ont pas besoin d&#8217;instance pour être appelées :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ArmeeDesDouzeSinges:
    <span style="color: #483d8b;">&quot;&quot;&quot;
        Ouais c'est un remake d'un film français aussi.
        Ça vous la coupe hein ?
    &quot;&quot;&quot;</span>
&nbsp;
    SINGES = <span style="color: #ff4500;">12</span>
&nbsp;
    @<span style="color: #008000;">classmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> nombre_de_singes_au_carre<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> cls.<span style="color: black;">SINGES</span> <span style="color: #66cc66;">*</span> cls.<span style="color: black;">SINGES</span>
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ArmeeDesDouzeSinges.<span style="color: black;">nombre_de_singes_au_carre</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">144</span></pre></div></div>

<p>Le premier paramètre n&#8217;est pas l&#8217;objet en cours mais la classe en cours, et c&#8217;est tout ce dont nous avons besoin ici pour accéder à <code>SINGES</code> puisque c&#8217;est un attribut de classe.</p>
<p>Cet exemple est issu d&#8217;un de mes codes réels de productions, vous pouvez en constater l’intérêt évident dans la vie de tous les jours.</p>
<p>Nan je déconne, moi j&#8217;utilise plutôt des dromadaires au quotidien.</p>
<p>Bon, mais sachez plus sérieusement qu&#8217;il y a en prime des méthodes de classe, des méthodes statiques. C&#8217;est la même chose, mais aucun paramètre n&#8217;est passé automatiquement.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> LHommeALaChaussureRouge:
    <span style="color: #483d8b;">&quot;&quot;&quot;
        Oui c'est exactement ce que vous pensez. C'est affligeant.
    &quot;&quot;&quot;</span>
&nbsp;
    @<span style="color: #008000;">staticmethod</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> crie_son_desespoir<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># pas de cls</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Nooooooooooooooooooooooooooooooooon&quot;</span>
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> LHommeALaChaussureRouge.<span style="color: black;">crie_son_desespoir</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Nooooooooooooooooooooooooooooooooon</pre></div></div>

<p>Alors là on arrive dans la feature anecdotique hein, du genre qu&#8217;on sort qu&#8217;au repas de Noël. Je la mets au menu juste pour que vous sachiez que ça existe, mais franchement je ne m&#8217;en sers presque jamais.</p>
<p>L&#8217;usage est le même qu&#8217;une méthode de classe, mais pour les trucs qui n&#8217;ont pas besoin d&#8217;avoir accès à la classe en cours.</p>
<p>Bon.</p>
<p>Bref, c&#8217;est juste une fonction préfixée. Avantage : elle est un poil plus rapide que la méthode de classe, et elle est mieux rangée qu&#8217;une simple fonction. Mais c&#8217;est vraiment tout.</p>
<h2>Retour sur les properties</h2>
<p>Si vous avez bonne mémoire, vous vous souviendrez qu&#8217;une propriété est juste un déguisement qu&#8217;on met sur une méthode pour qu&#8217;elle ressemble à un attribut :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> LesVisiteursEnAmerique:
    <span style="color: #483d8b;">&quot;&quot;&quot;
        Mais si, mais si...
    &quot;&quot;&quot;</span>
&nbsp;
    @<span style="color: #008000;">property</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'okay'</span>
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri = LesVisiteursEnAmerique<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri.<span style="color: black;">replique</span>
<span style="color: #483d8b;">'okay'</span></pre></div></div>

<p>Mais on peut aller plus loin que la lecture. On peut aussi décorer l&#8217;écriture et la suppression !</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> LesVisiteursEnAmerique<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># on rajoute (object) truc ici</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._replique = <span style="color: #483d8b;">'okay'</span> <span style="color: #808080; font-style: italic;"># c'est privé, pas touche, y a un underscore</span>
&nbsp;
&nbsp;
    @<span style="color: #008000;">property</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'get'</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._replique
&nbsp;
&nbsp;
    @replique.<span style="color: black;">setter</span> <span style="color: #808080; font-style: italic;"># le décorateur a le même nom que la méthode</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># value est la valeur à droite du '=' quand on set</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'set to {}'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._replique = value
&nbsp;
&nbsp;
    @replique.<span style="color: black;">deleter</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'delete'</span>
        <span style="color: #008000;">self</span>._replique = <span style="color: #008000;">None</span>
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri = LesVisiteursEnAmerique<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri.<span style="color: black;">replique</span>
get
<span style="color: #483d8b;">'okay'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri.<span style="color: black;">replique</span> = <span style="color: #483d8b;">'zarma'</span>
<span style="color: #008000;">set</span> to zarma
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri.<span style="color: black;">replique</span>
get
<span style="color: #483d8b;">'zarma'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri._replique
<span style="color: #483d8b;">'zarma'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">del</span> film_pourri.<span style="color: black;">replique</span>
delete
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_pourri.<span style="color: black;">replique</span>
get</pre></div></div>

<p>Et là vous allez me dire :</p>
<p>- c&#8217;est quoi ce (object) là haut là qui est apparu magiquement ?<br />
- et à quoi ça sert ? Nom d&#8217;un remake hollywodien !</p>
<p>À la première question je dirai, réponse dans la prochaine partie. Sachez juste que s&#8217;il y a pas ce <code>(object)</code>, le setter et le deleter ne marchent pas.</p>
<p>Pour la seconde, imaginez un truc un peu plus choupi, comme une réplique garantie d&#8217;être toujours en majuscule :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> LesVisiteursEnAmerique<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._replique = <span style="color: #483d8b;">'OKAY'</span>
&nbsp;
&nbsp;
    @<span style="color: #008000;">property</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._replique
&nbsp;
&nbsp;
    @replique.<span style="color: black;">setter</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> replique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._replique = value.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># PAF ! on majusculise</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_TRES_pourri = LesVisiteursEnAmerique<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_TRES_pourri.<span style="color: black;">replique</span>
<span style="color: #483d8b;">'OKAY'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_TRES_pourri.<span style="color: black;">replique</span> = <span style="color: #483d8b;">&quot;D'ac&quot;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> film_TRES_pourri.<span style="color: black;">replique</span>
<span style="color: #483d8b;">&quot;D'AC&quot;</span></pre></div></div>

<p>Et voilà le travail.</p>
<p>On peut donc &#8220;intercepter&#8221; la récupération, la suppression et la modification d&#8217;un attribut facilement. Cela permet d&#8217;exposer une belle API à base d&#8217;attribut, mais derrière faire des traitements complexes.</p>
<p>Il suffit de transformer un attribut normal en méthode, et de lui coller @<code>property</code> au cul.</p>
<p>C&#8217;est pour cette raison qu&#8217;on n&#8217;a jamais de getter et de setter en Python : on utilise les attributs tels quel, et si le besoin se présente, on en fait des propriétés.</p>
<p><a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-4/">Next stop</a>, héritage, overriding, polymorphisme et autres gros mots que vous pourrez ressortir aux soirées mousses dans les hackerspaces.</p>


feed_id: http://sametmax.com/?p=4303
title: Être alerté par Git quand un fichier a été modifié durant le dernier merge
uri: Être-alerté-par-Git-quand-un-fichier-a-été-modifié-durant-le-dern
url: http://sametmax.com/etre-alerte-par-git-quand-un-fichier-a-ete-modifie-durant-le-dernier-merge/
content:
<p>Il y a certains fichiers comme les migrations ou les fichiers de settings dont vous avez besoin de connaître l&#8217;état. Si un collègue les modifie et les push, vous voulez le savoir au moment du pull. Bien sûr vous pouvez scruter la liste des modifs à ce moment là, mais n&#8217;est-ce pas tellement mieux si votre ordinateur fait ça pour vous et affiche une grosse alerte rouge ?</p>
<p>Mettez le code suivant du le fichier <em>.git/hooks/post-merge</em> de votre repo en local :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># On met ici tous les fichiers (ou pattern de nom) qu'on veut surveiller</span>
<span style="color: #666666; font-style: italic;"># changez les pour les adapter à votre projet</span>
<span style="color: #007800;">files</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'settings.py'</span> <span style="color: #ff0000;">'migrations'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #666666; font-style: italic;"># on récupère tous les noms de fichiers modifiés depuis le dernier merge</span>
<span style="color: #007800;">modified_files</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #ff0000;">&quot;HEAD@{1}&quot;</span> --name-only<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># on boucle sur chaque nom de fichier surveillé</span>
<span style="color: #000000; font-weight: bold;">for</span> watched_file <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${files[@]}</span>&quot;</span>; <span style="color: #000000; font-weight: bold;">do</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># on liste tous les fichiers modifiés qui correspondent à ce nom de</span>
    <span style="color: #666666; font-style: italic;"># fichier surveillé</span>
    <span style="color: #007800;">modified_watched_files</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$modified_files</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #007800;">$watched_file</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># si le nombre de fichiers correspondant est plus grand que 0</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #800000;">${#modified_watched_files[@]}</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
&nbsp;
        <span style="color: #666666; font-style: italic;"># pour chaque fichier qui correspond, on affiche un avertissement</span>
        <span style="color: #666666; font-style: italic;"># en rouge</span>
        <span style="color: #000000; font-weight: bold;">for</span> modified_watched_file <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${modified_watched_files[@]}</span>&quot;</span>; <span style="color: #000000; font-weight: bold;">do</span>
&nbsp;
            <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;\e[41m &quot;</span><span style="color: #007800;">$modified_watched_file</span><span style="color: #ff0000;">&quot; has changed \033[0m&quot;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
&nbsp;
    <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Le hook post-merge est exécute après git pull (et seulement si il n&#8217;y a pas eu de conflit). Il va afficher une bonne grosse alerte en rouge pour chaque fichier surveillé qui a été modifié entre avant et après le pull.</p>
<p>Notez au passage la syntaxe intuitive de bash pour utiliser des tableaux. On dirait presque que le mec qui a codé bash était un pote du gars qui a codé git.</p>


feed_id: http://sametmax.com/?p=4309
title: FizzBuzz en Python
uri: FizzBuzz-en-Python
url: http://sametmax.com/fizzbuzz-en-python/
content:
<p>Le FizzBuzz est un type de test qui a été <a href="http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/">rendu populaire par Imran Ghory</a>  et ayant pour but de gagner du temps dans l&#8217;embauche de développeurs.</p>
<p>Son constat est alarmant : une grande majorité des gens qui venaient aux entretiens pour un poste de programmeur, diplôme / CV / beau discours à l&#8217;appui, ne savaient pas&#8230; programmer. Il faut dire que c&#8217;est tellement facile de <a href="http://sametmax.com/ou-trouver-un-job-ou-une-mission-python-django/">trouver un job pour dev</a>.</p>
<p>Ayant l&#8217;impression de perdre son temps, il a créé des exercices simples, qui sont facilement solvables sans stress par n&#8217;importe quel programmeur digne de ce ce nom en quelques minutes. À sa surprise, 90 % des candidats s&#8217;y cassent les dents, ce qui lui permet de ne passer du temps qu&#8217;avec le reste. </p>
<h2>Fais tourner le FizzBuzz</h2>
<p>Exemple d&#8217;un énoncé :</p>
<blockquote><p>
Écrire un programme qui affiche les nombres de 1 à 199. Mais pour les multiples de 3, afficher &#8220;Fizz&#8221; au lieu du nombre et pour les multiples de 5 afficher &#8220;Buzz&#8221;. Pour les nombres multiples de 3 et 5, afficher &#8220;FizzBuzz&#8221;.</p></blockquote>
<p>Voici ce que ça donne si vous le faites en entretien pour du Python en quelques minutes histoire de pouvoir passer à la suite :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>:
&nbsp;
    fizz = <span style="color: #ff7700;font-weight:bold;">not</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span>
    buzz = <span style="color: #ff7700;font-weight:bold;">not</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">5</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> fizz <span style="color: #ff7700;font-weight:bold;">and</span> buzz :
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;FizzBuzz&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> fizz:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> buzz:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Buzz&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> x</pre></div></div>

<h2>S&#8217;amuser un peu</h2>
<p>Ce qui est marrant avec les fizzbuzz, c&#8217;est de sortir de la solution classique pour faire des trucs tordus. Je suis notamment tombé sur <a href="http://maxburstein.com/blog/python-shortcuts-for-the-python-beginner/">deux</a> <a href="http://stackoverflow.com/questions/6890037/python-fizzbuzz-in-one-line">one-liners</a> très choupi pour résoudre le problème en Python :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span><span style="color: black;">&#91;</span>x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">4</span>:<span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;Buzz&quot;</span> <span style="color: black;">&#91;</span>x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">5</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">4</span>:<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> x</pre></div></div>

<p>Et :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Fizz'</span> <span style="color: #66cc66;">*</span> <span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">not</span> i <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">'Buzz'</span> <span style="color: #66cc66;">*</span> <span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">not</span> i <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>C&#8217;est blindé d&#8217;astuces.</p>
<p>Pour la première solution, on fait une boucle normale et on <code>print</code> la concaténation de la chaîne <code>"Fizz"</code> et la chaîne <code>"Buzz"</code>. MAIS on fait un slicing dessus en prenant en compte une particularité de <code>"Fizz"</code> et <code>"Buzz"</code> : les deux mots font 4 lettres. Or <code>x % 3</code> (ou <code>x % 5</code>) sera égal à 0 si <code>x</code> est multiple de 3 (ou de 5). Donc si <code>x</code> est un multiple, on aura <code>0 * 4</code>, soit un slicing de <code>[0:]</code> qui veut dire va du début à la fin. A l&#8217;inverse, si <code>x</code> n&#8217;est pas multiple, on aura un slicing de <code>[4:]</code>, ce qui sur un mot de 4 lettres veut dire va de la fin à la fin, résultant en une chaîne vide.</p>
<p>Donc on peut avoir <code>"Fizz"</code> de vide ou <code>"Buzz"</code> de vide, ce qui va faire la chaîne &#8220;Fizz&#8221; ou &#8220;Buzz&#8221;, selon que <code>x</code> est le multiple de 3 ou 5. Si <code>x</code> est multiple des deux, on aura <code>"Fizz"</code> et <code>"Buzz"</code>, qui concaténés va donner <code>"FizzBuzz"</code>. Enfin, si <code>x</code> n&#8217;est multiple ni de 3, ni de 5, on concatène deux chaînes vides, ce qui donne une chaîne vide. </p>
<p>Une caractéristique de l&#8217;opérateur <code>or</code> en Python est qu&#8217;il ne retourne PAS un booléen. Il retourne le premier élément vrai, ou le dernier élément faux :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #ff4500;">2</span>
<span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #ff4500;">2</span>
<span style="color: #ff4500;">2</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">False</span>
<span style="color: #008000;">False</span></pre></div></div>

<p>Donc si il y a <code>"Fizz" or x</code>, <code>"Buzz" or x</code> ou <code>"FizzBuzz" or x</code>, il va retourner la chaîne. Par contre si il y a <code>'' or x</code>, il va retourner <code>x</code>.</p>
<p>Pour la deuxième solution, on créé une <a href="http://sametmax.com/python-love-les-listes-en-intention-partie-2/">expression génératrice</a> qui va être joinée sur <code>'\n'</code>, donc un saut de ligne. On aura donc le listing attendu. Les valeurs sont générées par concaténation également, comme dans le premier exemple. La différence est qu&#8217;au lieu de choisir le slicing pour afficher ou non la chaîne, il utilise <a href="http://sametmax.com/operateur-splat-ou-etoile-en-python/">l&#8217;opérateur splat</a>, qui sur une chaîne la multiplie :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span>
<span style="color: #483d8b;">'FizzFizz'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">3</span>
<span style="color: #483d8b;">'FizzFizzFizz'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1</span>
<span style="color: #483d8b;">'Fizz'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">0</span>
<span style="color: #483d8b;">''</span></pre></div></div>

<p>Or, <code>True</code> vaut 1 en Python, et <code>False</code> vaut zéro. Du coup :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">True</span>
<span style="color: #483d8b;">'Fizz'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">&quot;Fizz&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">False</span>
<span style="color: #483d8b;">''</span></pre></div></div>

<p><code>not i % 5</code> et <code>not i % 5</code> vont retourner <code>True</code> si <code>x</code> est multiple, sinon <code>False</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff4500;">15</span> <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">5</span>
<span style="color: #ff4500;">0</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff4500;">15</span> <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">5</span>
<span style="color: #008000;">True</span></pre></div></div>

<p>Du coup <code>"Fizz"</code> et <code>"Buzz"</code> vont être multiplié par <code>True</code> ou <code>False</code> selon que <code>x</code> est un multiple de 3 ou 5, et la chaîne résultante sera la bonne. Après on utilise le <code>or</code> de la même façon que dans le code du premier one-liner.</p>
<h2>Mais quand même</h2>
<p>Je trouve ça un peu déprimant que l&#8217;on ait autant de personnes qui se vendent comme codeurs et qui ne savent pas coder. Ok, je veux bien que dans une situation de stress les bouts de codes sortent plus difficilement, mais là c&#8217;est volontairement hyper simple. Personne ne demande le one-liner, c&#8217;est juste pour le fun. Mais la majorité des candidats ne peuvent même pas produire le tout premier code.</p>
<p>C&#8217;est aussi mon constat dans les boîtes dans lesquelles j&#8217;ai travaillé : énormément de flan.</p>
<p>Se pose alors un autre problème : la rareté de la main d’œuvre. Je discutais avec un CTO dernièrement. Il me disait que quand il tombait sur un bon candidat, il lui déroulait le tapis rouge car il avait trop peur qu&#8217;il se barre. C&#8217;était très dur pour lui de trouver un dev potable. </p>
<p>À côté de ça, on voit des annonces sur Popole emploi où il demande de maîtriser vingt-douze technos pour le SMIC.</p>
<p>C&#8217;est là qu&#8217;on voit que la grande majorité des gens ne pigent toujours rien à l&#8217;informatique. Ils n&#8217;ont aucune idée des échelles de valeur et de qualité. </p>
<p>On se retrouve avec une situation de loose-loose :</p>
<ul>
<li>Les boîtes non-tech se retrouvent avec le fond du panier car elles embauchent en aveugle et les utilisateurs se retrouvent en mode dégradé en permanence. Une personne qui travaille chez Colissimo m&#8217;a parlé dernièrement de l&#8217;enfer du développement de leur système de gestion de paie fait en interne par un mec qui visiblement ne pige rien.</li>
<li>Les boîtes technos en chie un max pour trouver des bons dev. Ils sont souvent en sous-effectifs et se plaignent d&#8217;enchaîner les entretiens depuis un an sans rien trouver.</li>
<li>Les devs se sentent insultés par la plupart des annonces de job et les bons trouvent rarement (en France) un salaire et des conditions de travail qui correspondent à leurs qualifications. Car un bon dev aujourd&#8217;hui est quelqu&#8217;un de TRES qualifié. Or il est souvent classé selon son diplôme plutôt que ses compétences.</li>
</ul>


feed_id: http://sametmax.com/?p=4395
uri: 2013-02-04-Le-guide-ultime-et-définitif-sur-la-programmation-orientée-objet-en
title:
Le guide ultime et définitif sur la programmation orientée objet en Python à l’usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 4.

url:
http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-4/

content:
<p>Un peu de zik, puisque c&#8217;est ce qu&#8217;on fait maintenant :</p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe width="420" height="315" src="http://www.youtube.com/embed/5DeOSLNbhfg" frameborder="0" scrolling="no" class="iframe-class"></iframe>
<p>Prérequis :</p>
<ul>
<li>Avoir lu (et compris) la <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-3/">partie 3</a></li>
</ul>
<p>Aujourd&#8217;hui nous allons voir ce qui fait toute la puissance de la programmation orientée objet : l&#8217;héritage.</p>
<h2>Héritage simple</h2>
<p>L&#8217;héritage est un moyen de factoriser du code, c&#8217;est à dire que si on a le même code à deux endroits, l&#8217;héritage permet de centraliser ce code à un seul endroit. Ce n&#8217;est pas le seul moyen de faire ça. On peut très bien factoriser du code uniquement avec des fonctions. Néanmoins l&#8217;héritage a des caractéristiques qui rendent la factorisation très efficace.</p>
<p>Supposons que vous fassiez un jeu vidéo pour apprendre les prières chrétiennes, et que vous ayez une classe par prière :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> AveMaria:
&nbsp;
&nbsp;
    texte = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Je vous salue, Marie pleine de grâce ;&quot;</span>,
            <span style="color: #483d8b;">&quot;Le Seigneur est avec vous.&quot;</span>,
            <span style="color: #483d8b;">&quot;Vous êtes bénie entre toutes les femmes&quot;</span>,
            <span style="color: #483d8b;">&quot;Et Jésus, le fruit de vos entrailles, est béni.&quot;</span>,
            <span style="color: #483d8b;">&quot;Sainte Marie, Mère de Dieu,&quot;</span>,
            <span style="color: #483d8b;">&quot;Priez pour nous, pauvres pécheurs,&quot;</span>,
            <span style="color: #483d8b;">&quot;Maintenant, et à l'heure de notre mort.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen.&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> ligne
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PaterNoster:
&nbsp;
&nbsp;
    texte = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Notre Père qui es aux cieux&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton nom soit sanctifié&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton règne vienne,&quot;</span>,
            <span style="color: #483d8b;">&quot;que ta volonté soit faite&quot;</span>,
            <span style="color: #483d8b;">&quot;sur la terre comme au ciel.&quot;</span>,
            <span style="color: #483d8b;">&quot;Donne-nous aujourd’hui&quot;</span>,
            <span style="color: #483d8b;">&quot;notre pain de ce jour,&quot;</span>,
            <span style="color: #483d8b;">&quot;pardonne-nous nos offenses&quot;</span>,
            <span style="color: #483d8b;">&quot;comme nous pardonnons aussi&quot;</span>,
            <span style="color: #483d8b;">&quot;à ceux qui nous ont offensés&quot;</span>,
            <span style="color: #483d8b;">&quot;et ne nous soumets pas à la tentation&quot;</span>,
            <span style="color: #483d8b;">&quot;mais délivre-nous du mal.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> ligne
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> piere = AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> piere.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Je vous salue, Marie pleine de grâce <span style="color: #66cc66;">;</span>
Le Seigneur est avec vous.
<span style="color: black;">Vous</span> êtes bénie entre toutes les femmes
Et Jésus, le fruit de vos entrailles, est béni.
<span style="color: black;">Sainte</span> Marie, Mè<span style="color: #dc143c;">re</span> de Dieu,
Priez pour nous, pauvres pécheurs,
Maintenant, et à l<span style="color: #483d8b;">'heure de notre mort.
Amen.</span></pre></div></div>

<p>Ici la méthode <code>prier()</code> est dupliquée. Or, c&#8217;est exactement la même. Il n&#8217;y a pas de raison de l&#8217;écrire deux fois. Nous allons utiliser l&#8217;héritage pour centraliser ce code en créant une classe <code>Priere</code> qui contiendra le code commun à toutes les prières :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Priere:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> ligne</pre></div></div>

<p>Ensuite, nous allons demander à toutes les classes prières d&#8217;hériter de cette classe commune :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> AveMaria<span style="color: black;">&#40;</span>Priere<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># &lt;---- cette syntaxe veut dire 'hérite de Priere'</span>
&nbsp;
    texte = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Je vous salue, Marie pleine de grâce ;&quot;</span>,
            <span style="color: #483d8b;">&quot;Le Seigneur est avec vous.&quot;</span>,
            <span style="color: #483d8b;">&quot;Vous êtes bénie entre toutes les femmes&quot;</span>,
            <span style="color: #483d8b;">&quot;Et Jésus, le fruit de vos entrailles, est béni.&quot;</span>,
            <span style="color: #483d8b;">&quot;Sainte Marie, Mère de Dieu,&quot;</span>,
            <span style="color: #483d8b;">&quot;Priez pour nous, pauvres pécheurs,&quot;</span>,
            <span style="color: #483d8b;">&quot;Maintenant, et à l'heure de notre mort.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen.&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PaterNoster<span style="color: black;">&#40;</span>Priere<span style="color: black;">&#41;</span>:
&nbsp;
    texte = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Notre Père qui es aux cieux&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton nom soit sanctifié&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton règne vienne,&quot;</span>,
            <span style="color: #483d8b;">&quot;que ta volonté soit faite&quot;</span>,
            <span style="color: #483d8b;">&quot;sur la terre comme au ciel.&quot;</span>,
            <span style="color: #483d8b;">&quot;Donne-nous aujourd’hui&quot;</span>,
            <span style="color: #483d8b;">&quot;notre pain de ce jour,&quot;</span>,
            <span style="color: #483d8b;">&quot;pardonne-nous nos offenses&quot;</span>,
            <span style="color: #483d8b;">&quot;comme nous pardonnons aussi&quot;</span>,
            <span style="color: #483d8b;">&quot;à ceux qui nous ont offensés&quot;</span>,
            <span style="color: #483d8b;">&quot;et ne nous soumets pas à la tentation&quot;</span>,
            <span style="color: #483d8b;">&quot;mais délivre-nous du mal.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Ici, les classes <code>AveMaria</code> et <code>PaterNoster</code> héritent de la classe <code>Priere</code>. On dit qu&#8217;elles sont les enfants (ou filles) de <code>Priere</code>. Ou que <code>Priere</code> est la classe parente de <code>AveMaria</code> et <code>PaterNoster</code></p>
<p>Notez qu&#8217;on a retiré la méthode <code>prier()</code> de <code>PaterNoster</code> et <code>AveMaria</code>. Malgré cela, ça marche :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> PaterNoster<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Notre Pè<span style="color: #dc143c;">re</span> qui es aux cieux
que ton nom soit sanctifié
que ton règne vienne,
que ta volonté soit faite
sur la terre comme au ciel.
<span style="color: black;">Donne</span>-nous aujourd<span style="color: #483d8b;">'hui
notre pain de ce jour,
pardonne-nous nos offenses
comme nous pardonnons aussi
à ceux qui nous ont offensés
et ne nous soumets pas à la tentation
mais délivre-nous du mal.
Amen</span></pre></div></div>

<p>Cela marche car quand on hérite d&#8217;une classe, le code de cette classe est copié de la classe parente vers la classe enfant. Ainsi, <code>prier()</code> est automatiquement copiée de <code>Priere</code> vers <code>AveMaria</code> et <code>PaterNostre</code>.</p>
<p>Cela marche pour toutes les méthodes, même celles appelées automatiquement. C&#8217;est particulièrement utile avec la méthode <code>__init__</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Priere:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, expiation=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span> = expiation
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne</pre></div></div>

<p>On rajoute ici un attribut, et il se retrouve dans la classe enfant (si vous êtes dans un shell, n&#8217;oubliez pas de réécrire aussi la classe <code>AveMaria</code> à chaque fois, même si elle ne change pas):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> priere = AveMaria<span style="color: black;">&#40;</span>expiation=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> priere.<span style="color: black;">expiation</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> priere.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
JE VOUS SALUE, MARIE PLEINE DE GRâCE <span style="color: #66cc66;">;</span>
LE SEIGNEUR EST AVEC VOUS.
<span style="color: black;">VOUS</span> êTES BéNIE ENTRE TOUTES LES FEMMES
ET JéSUS, LE FRUIT DE VOS ENTRAILLES, EST BéNI.
<span style="color: black;">SAINTE</span> MARIE, MèRE DE DIEU,
PRIEZ POUR NOUS, PAUVRES PéCHEURS,
MAINTENANT, ET à L<span style="color: #483d8b;">'HEURE DE NOTRE MORT.
AMEN.</span></pre></div></div>

<p>L&#8217;héritage, c&#8217;est juste cela. Pas la peine de chercher une truc compliqué : le code du parent se retrouve dans celui de l&#8217;enfant. Cela marche pour les méthodes et les attributs.</p>
<h2>Petite appartée sur <code>object</code></h2>
<p>Dans la partie précédente et dans de nombreux codes, vous avez dû voir des classes comme cela :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MaClass<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># wtf is this object stuff ?</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># code</span></pre></div></div>

<p>Il s&#8217;agit bel et bien d&#8217;héritage, <code>object</code> étant un type buil-in en Python au même titre que les string ou les int :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">object</span>
<span style="color: #66cc66;">&lt;</span>type <span style="color: #483d8b;">'object'</span><span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>La raison de cet héritage bizarre est qu&#8217;à partir de Python 2.2, une nouvelle architecture des classes a été introduite qui corrige les problèmes de l&#8217;ancienne. Mais pour garder le code compatible, ces nouvelles classes n&#8217;ont pas été activées par défaut.</p>
<p>Ainsi, même si vous êtes en Python 2.7, quand vous faites :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MaClass:
&nbsp;
    <span style="color: #808080; font-style: italic;"># code</span></pre></div></div>

<p>Vous utilisez l&#8217;ancien type de classe (old-style class). Pour dire à Python que vous voulez utiliser le nouveau type de classe (new-style class), il faut hériter d&#8217;<code>object</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MaClass<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># code</span></pre></div></div>

<p><strong>Il n&#8217;y a AUCUN intérêt à utiliser les old-style classes.</strong> Je l&#8217;ai fais en ce début de cours pour éviter d&#8217;introduire la notion d&#8217;héritage trop tôt.</p>
<p>A partir de maintenant, quand vous créez une nouvelle classe qui n&#8217;a pas de parent, faites la TOUJOURS hériter de <code>object</code>.</p>
<p>Des tas de fonctions (par exemple les properties) fonctionnent beaucoup mieux avec les new-style classes. (D&#8217;ailleurs à partir de Python 3, elles sont activées par défaut)</p>
<p>Ainsi, notre classe Priere doit ressembler à ça maintenant :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Priere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, expiation=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span> = expiation
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne</pre></div></div>

<h2>Overriding</h2>
<p>Parfois on veut tout le code du parent dans l&#8217;enfant. Parfois juste une partie. L&#8217;héritage vous permet de réécrire certaines méthodes du parent dans l&#8217;enfant, c&#8217;est ce qu&#8217;on appelle l&#8217;overriding.</p>
<p>Quand vous faites :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Parent<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'foo'</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Enfant<span style="color: black;">&#40;</span>Parent<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>En fait vous faites en quelque sorte :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Enfant<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'foo'</span></pre></div></div>

<p>Si vous faites :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Enfant<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'foo'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'bar'</span></pre></div></div>

<p>Vous allez écraser la première méthode avec la deuxième, car elles portent toutes les deux le même nom :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> Enfant<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">truc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
bar</pre></div></div>

<p>&#8220;Ecraser&#8221; en anglais, se dit &#8220;to override&#8221;. Félicitation, vous venez d&#8217;apprendre l&#8217;overriding ! Ce qu&#8217;on vient de voir plus haut s&#8217;écrit comme ça dans le cadre de l&#8217;héritage :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Parent<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'foo'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Enfant1<span style="color: black;">&#40;</span>Parent<span style="color: black;">&#41;</span>: 
    <span style="color: #ff7700;font-weight:bold;">pass</span> <span style="color: #808080; font-style: italic;"># pas d'overriding</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Enfant2<span style="color: black;">&#40;</span>Parent<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> truc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'bar'</span> <span style="color: #808080; font-style: italic;"># overriding !</span>
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> Enfant1<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">truc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
foo
<span style="color: #66cc66;">&gt;&gt;&gt;</span> Enfant2<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">truc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
bar</pre></div></div>

<p><code>Enfant1</code> a tout le code du parent qui est copié. <code>Enfant2</code> aussi, mais il réécrit la méthode, donc sa version de la méthode écrase celle du parent.</p>
<p>Voyons ce que ça donne sur un cas plus concret dans la vie de tous les jours comme les prières chrétiennes (promis je fais les sourates du Coran si je fais un tuto Haskell) :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Priere<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, expiation=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span> = expiation
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">texte</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PaterNoster<span style="color: black;">&#40;</span>Priere<span style="color: black;">&#41;</span>:
&nbsp;
    texte = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Notre Père qui es aux cieux&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton nom soit sanctifié&quot;</span>,
            <span style="color: #483d8b;">&quot;que ton règne vienne,&quot;</span>,
            <span style="color: #483d8b;">&quot;que ta volonté soit faite&quot;</span>,
            <span style="color: #483d8b;">&quot;sur la terre comme au ciel.&quot;</span>,
            <span style="color: #483d8b;">&quot;Donne-nous aujourd’hui&quot;</span>,
            <span style="color: #483d8b;">&quot;notre pain de ce jour,&quot;</span>,
            <span style="color: #483d8b;">&quot;pardonne-nous nos offenses&quot;</span>,
            <span style="color: #483d8b;">&quot;comme nous pardonnons aussi&quot;</span>,
            <span style="color: #483d8b;">&quot;à ceux qui nous ont offensés&quot;</span>,
            <span style="color: #483d8b;">&quot;et ne nous soumets pas à la tentation&quot;</span>,
            <span style="color: #483d8b;">&quot;mais délivre-nous du mal.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># sur avemaria, on veut mettre en avant la version en araméen</span>
<span style="color: #808080; font-style: italic;"># par l'araméen c'est trop cool (ça ressemble au langage des furlings</span>
<span style="color: #808080; font-style: italic;"># dans stargate)</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> AveMaria<span style="color: black;">&#40;</span>Priere<span style="color: black;">&#41;</span>: 
&nbsp;
    vf = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Je vous salue, Marie pleine de grâce ;&quot;</span>,
            <span style="color: #483d8b;">&quot;Le Seigneur est avec vous.&quot;</span>,
            <span style="color: #483d8b;">&quot;Vous êtes bénie entre toutes les femmes&quot;</span>,
            <span style="color: #483d8b;">&quot;Et Jésus, le fruit de vos entrailles, est béni.&quot;</span>,
            <span style="color: #483d8b;">&quot;Sainte Marie, Mère de Dieu,&quot;</span>,
            <span style="color: #483d8b;">&quot;Priez pour nous, pauvres pécheurs,&quot;</span>,
            <span style="color: #483d8b;">&quot;Maintenant, et à l'heure de notre mort.&quot;</span>,
            <span style="color: #483d8b;">&quot;Amen.&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    vo = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ܡܠܝܬ ܛܝܒܘܬܐ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܡܪܢ ܥܡܟܝ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܡܒܪܟܬܐ ܐܢܬܝ ܒܢܫ̈ܐ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܘܡܒܪܟ ܗܘ ܦܐܪܐ ܕܒܟܪܣܟܝ ܡܪܢ ܝܫܘܥ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܐܘ ܩܕܝܫܬܐ ܡܪܝܡ ܝܠܕܬ ܐܠܗܐ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܨܠܝ ܚܠܦܝܢ ܚܛܝ̈ܐ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܗܫܐ ܘܒܫܥܬ ܘܡܘܬܢ&quot;</span>,
          <span style="color: #483d8b;">&quot;ܐܡܝܢ܀&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prier<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nombre_de_fois=<span style="color: #ff4500;">1</span>, version=<span style="color: #483d8b;">'vo'</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>nombre_de_fois<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> ligne <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, version, <span style="color: #483d8b;">'vo'</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">expiation</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span> ligne
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
ܡܠܝܬ ܛܝܒܘܬܐ
ܡܪܢ ܥܡܟܝ
ܡܒܪܟܬܐ ܐܢܬܝ ܒܢܫ̈ܐ
ܘܡܒܪܟ ܗܘ ܦܐܪܐ ܕܒܟܪܣܟܝ ܡܪܢ ܝܫܘܥ
ܐܘ ܩܕܝܫܬܐ ܡܪܝܡ ܝܠܕܬ ܐܠܗܐ
ܨܠܝ ܚܠܦܝܢ ܚܛܝ̈ܐ
ܗܫܐ ܘܒܫܥܬ ܘܡܘܬܢ
ܐܡܝܢ܀
<span style="color: #66cc66;">&gt;&gt;&gt;</span> AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #483d8b;">'vf'</span><span style="color: black;">&#41;</span>
Je vous salue, Marie pleine de grâce <span style="color: #66cc66;">;</span>
Le Seigneur est avec vous.
<span style="color: black;">Vous</span> êtes bénie entre toutes les femmes
Et Jésus, le fruit de vos entrailles, est béni.
<span style="color: black;">Sainte</span> Marie, Mè<span style="color: #dc143c;">re</span> de Dieu,
Priez pour nous, pauvres pécheurs,
Maintenant, et à l<span style="color: #483d8b;">'heure de notre mort.
Amen.
Je vous salue, Marie pleine de grâce ;
Le Seigneur est avec vous.
Vous êtes bénie entre toutes les femmes
Et Jésus, le fruit de vos entrailles, est béni.
Sainte Marie, Mère de Dieu,
Priez pour nous, pauvres pécheurs,
Maintenant, et à l'</span>heure de notre mort.
<span style="color: black;">Amen</span>.</pre></div></div>

<p>Ici la classe <code>AveMaria</code> hérite de la classe <code>Priere</code>. Deux méthodes sont copiées de <code>Priere</code> vers <code>AveMaria</code> : <code>__init__</code> et <code>prier()</code>.</p>
<p><code>__init__</code> ne change pas. Donc <code>AveMaria</code> a toujours le <code>__init__</code> de <code>Priere</code>. Par contre, on a overridé <code>prier()</code> dans <code>AveMaria</code>, qui est maintenant un code personnalisé<code>.<br />
</code><br />
Ceci nous permet donc de bénéficier d&#8217;une partie du code en commun (<code>__init__</code>), et de choisir un comportement différent pour d&#8217;autres bout du code (<code>prier()</code>).</p>
<p>La classe <code>PaterNoster</code>, elle, n&#8217;est pas affectée. Elle n&#8217;override rien, et sa méthode <code>prier()</code> est la même que celle de <code>Priere</code>.</p>
<p>Peut-être voulez-vous une exemple plus terre à terre (et moins dans les cieux) :</p>
<p>Prenez la bibliothèque <a href="http://sametmax.com/path-py-plus-en-detail/">path.py</a>, par exemple. Normalement quand on additionne deux strings, ça les concatène. Mais quand on les divise, le comportement par défaut est de lever une erreur.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">'/home/sam'</span> + <span style="color: #483d8b;">'/blog'</span>
<span style="color: #483d8b;">'/home/sam/blog'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">'/home/sam'</span> / <span style="color: #483d8b;">'/blog'</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-58-8701a4e82b4b&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    <span style="color: #483d8b;">'/home/sam'</span> / <span style="color: #483d8b;">'/blog'</span>
<span style="color: #008000;">TypeError</span>: unsupported operand <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> /: <span style="color: #483d8b;">'str'</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">'str'</span></pre></div></div>

<p>Path.py override ce comportement :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> path<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># hé oui, on peut hériter des types de base</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__div__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># override le comportement face à l'opérateur '/'</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> path<span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
... <span style="color: black;">p</span> = path<span style="color: black;">&#40;</span><span style="color: #483d8b;">'/home/sam'</span><span style="color: black;">&#41;</span>
... <span style="color: #ff7700;font-weight:bold;">print</span> p / <span style="color: #483d8b;">'blog'</span>
/home/sam/blog</pre></div></div>

<p>Ca nous donne une très jolie interface pour la manipulation des chemins d&#8217;accès.</p>
<h2>Polymorphisme et autres diableries</h2>
<p>Comme d&#8217;hab en prog, on adore les mots qui font super hype de la vibes du flex.</p>
<p>Le polymorphisme fait partie de ces termes compliqués qui cachent une notion simple : avoir une API commune qui fait des choses différentes.</p>
<p>Voyez-vous, nos deux classes <code>AveMaria</code> et <code>PaterNoster</code>, sont toutes les deux filles de la même classe parente. Elles se ressemblent donc beaucoup : elles ont des attributs et des méthodes en commun :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> p1 = AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p2 = PaterNoster<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p1.<span style="color: black;">expiation</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p2.<span style="color: black;">expiation</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p1.<span style="color: black;">prier</span>
<span style="color: #66cc66;">&lt;</span>bound method AveMaria.<span style="color: black;">prier</span> of <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">AveMaria</span> <span style="color: #008000;">object</span> at 0x20618d0<span style="color: #66cc66;">&gt;&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p2.<span style="color: black;">prier</span>
<span style="color: #66cc66;">&lt;</span>bound method PaterNoster.<span style="color: black;">prier</span> of <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">PaterNoster</span> <span style="color: #008000;">object</span> at 0x2061c90<span style="color: #66cc66;">&gt;&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p1.<span style="color: #0000cd;">__init__</span>
<span style="color: #66cc66;">&lt;</span>bound method AveMaria.<span style="color: #0000cd;">__init__</span> of <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">AveMaria</span> <span style="color: #008000;">object</span> at 0x20618d0<span style="color: #66cc66;">&gt;&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p2.<span style="color: #0000cd;">__init__</span>
<span style="color: #66cc66;">&lt;</span>bound method PaterNoster.<span style="color: #0000cd;">__init__</span> of <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">PaterNoster</span> <span style="color: #008000;">object</span> at 0x2061c90<span style="color: #66cc66;">&gt;&gt;</span></pre></div></div>

<p>Ce sont pourtant des classes différentes (et <code>prier()</code> ne fait pas du tout le même chose), mais elles partagent ce qu&#8217;on appelle une API (une interface), c&#8217;est à dire une manière de les utiliser.</p>
<p>Cette capacité à être utilisé pareil, mais produire un résultat diffférent est ce qu&#8217;on appelle le polymorphisme (et c&#8217;est la base du <a href="https://fr.wikipedia.org/wiki/Duck_typing">duck typing</a>). Concrètement ça veut dire que vous pouvez utiliser les deux classes dans le même contexte, sans vous soucier de si c&#8217;est l&#8217;une ou l&#8217;autre :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> prieres = <span style="color: black;">&#91;</span>AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, PaterNoster<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, PaterNoster<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> prieres
<span style="color: black;">&#91;</span><span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">AveMaria</span> <span style="color: #008000;">object</span> at 0x2061d50<span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">AveMaria</span> <span style="color: #008000;">object</span> at 0x2061d90<span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">PaterNoster</span> <span style="color: #008000;">object</span> at 0x2061f50<span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">AveMaria</span> <span style="color: #008000;">object</span> at 0x2061f90<span style="color: #66cc66;">&gt;</span>, <span style="color: #66cc66;">&lt;</span>__main__.<span style="color: black;">PaterNoster</span> <span style="color: #008000;">object</span> at 0x2061fd0<span style="color: #66cc66;">&gt;</span><span style="color: black;">&#93;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> priere <span style="color: #ff7700;font-weight:bold;">in</span> prieres: 
...     <span style="color: black;">priere</span>.<span style="color: black;">prier</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># prier une prière, ça se fait pareil</span>
&nbsp;
ܡܠܝܬ ܛܝܒܘܬܐ
ܡܪܢ ܥܡܟܝ
ܡܒܪܟܬܐ ܐܢܬܝ ܒܢܫ̈ܐ
ܘܡܒܪܟ ܗܘ ܦܐܪܐ ܕܒܟܪܣܟܝ ܡܪܢ ܝܫܘܥ
ܐܘ ܩܕܝܫܬܐ ܡܪܝܡ ܝܠܕܬ ܐܠܗܐ
ܨܠܝ ܚܠܦܝܢ ܚܛܝ̈ܐ
ܗܫܐ ܘܒܫܥܬ ܘܡܘܬܢ
ܐܡܝܢ܀
ܡܠܝܬ ܛܝܒܘܬܐ
ܡܪܢ ܥܡܟܝ
ܡܒܪܟܬܐ ܐܢܬܝ ܒܢܫ̈ܐ
ܘܡܒܪܟ ܗܘ ܦܐܪܐ ܕܒܟܪܣܟܝ ܡܪܢ ܝܫܘܥ
ܐܘ ܩܕܝܫܬܐ ܡܪܝܡ ܝܠܕܬ ܐܠܗܐ
ܨܠܝ ܚܠܦܝܢ ܚܛܝ̈ܐ
ܗܫܐ ܘܒܫܥܬ ܘܡܘܬܢ
ܐܡܝܢ܀
Notre Pè<span style="color: #dc143c;">re</span> qui es aux cieux
que ton nom soit sanctifié
que ton règne vienne,
que ta volonté soit faite
sur la terre comme au ciel.
<span style="color: black;">Donne</span>-nous aujourd’hui
notre pain de ce jour,
pardonne-nous nos offenses
comme nous pardonnons aussi
à ceux qui nous ont offensés
et ne nous soumets pas à la tentation
mais délivre-nous du mal.
<span style="color: black;">Amen</span>
ܡܠܝܬ ܛܝܒܘܬܐ
ܡܪܢ ܥܡܟܝ
ܡܒܪܟܬܐ ܐܢܬܝ ܒܢܫ̈ܐ
ܘܡܒܪܟ ܗܘ ܦܐܪܐ ܕܒܟܪܣܟܝ ܡܪܢ ܝܫܘܥ
ܐܘ ܩܕܝܫܬܐ ܡܪܝܡ ܝܠܕܬ ܐܠܗܐ
ܨܠܝ ܚܠܦܝܢ ܚܛܝ̈ܐ
��ܫܐ ܘܒܫܥܬ ܘܡܘܬܢ
ܐܡܝܢ܀
Notre Pè<span style="color: #dc143c;">re</span> qui es aux cieux
que ton nom soit sanctifié
que ton règne vienne,
que ta volonté soit faite
sur la terre comme au ciel.
<span style="color: black;">Donne</span>-nous aujourd’hui
notre pain de ce jour,
pardonne-nous nos offenses
comme nous pardonnons aussi
à ceux qui nous ont offensés
et ne nous soumets pas à la tentation
mais délivre-nous du mal.
<span style="color: black;">Amen</span></pre></div></div>

<p>Le polymorphisme, c&#8217;est donc l&#8217;utilisation de l&#8217;héritage pour faire des choses différentes, mais en proposant la même interface (ensemble de méthodes et d&#8217;attributs) pour le faire. Le polymorphisme s&#8217;étend aussi à la réaction aux opérateurs (+, -, /, or, and, etc), d&#8217;autant qu&#8217;en Python, c&#8217;est implémenté avec les méthodes nommées avec <code>__</code>.</p>
<p>Un dernier point pour les gens qui se demandent ce que veut dire <em>overloader</em>. L&#8217;overload est lié à l&#8217;override et au polymorphisme, mais ce n&#8217;est pas la même chose : elle consiste à overrider plusieurs fois une même méthode avec une signature différente. Il n&#8217;y a pas d&#8217;overload en Python, la notion ne nous concerne donc pas. Si vous voulez en apprendre plus, chopez un tuto Java ou C++.</p>
<h2>Qui est qui</h2>
<p>Avec l&#8217;héritage vient la notion de type. Quand vous créez une classe, vous créez un nouveau type. Quand vous sous-classez, vous créez un sous-type.</p>
<p>C&#8217;est intéressant, car une classe fille, est de son propre type ET du type de son parent (mais l&#8217;inverse n&#8217;est pas vrai).</p>
<p>Avec Python, on vérifie cela avec <code>isinstance()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>Priere<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, Priere<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># instance de sa propre classe</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>Priere<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># pas l'instance d'une classe quelconque</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>Priere<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, AveMaria<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># pas l'instance d'un enfant</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, AveMaria<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># instance de sa propre classe</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>AveMaria<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, Priere<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># instance de sa classe parente</span>
<span style="color: #008000;">True</span></pre></div></div>

<p>C&#8217;est utile, car certains comportements sont basés sur le type. Le plus important étant le mécanisme des exceptions. Un <code>try</code> / <code>except</code> arrêtera l&#8217;exception demandée, <strong>ou du même type</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FillesDeMonExceptionPerso<span style="color: black;">&#40;</span>MonExceptionPerso<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> MonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alerte ! Alerte !'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> MonExceptionPerso:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Exception arrêtée'</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> FillesDeMonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alerte ! Alerte !'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> FillesDeMonExceptionPerso:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Exception arrêtée'</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> FillesDeMonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alerte ! Alerte !'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> MonExceptionPerso:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Exception arrêtée'</span>    
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> MonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alerte ! Alerte !'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> FillesDeMonExceptionPerso:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Exception arrêtée'</span>    
&nbsp;
&nbsp;
<span style="color: #008000;">Exception</span> arrêtée
<span style="color: #008000;">Exception</span> arrêtée
<span style="color: #008000;">Exception</span> arrêtée
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-67-7e7aec1e78c9&gt;&quot;</span>, line <span style="color: #ff4500;">21</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    <span style="color: #ff7700;font-weight:bold;">raise</span> MonExceptionPerso<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alerte ! Alerte !'</span><span style="color: black;">&#41;</span>
MonExceptionPerso: Alerte <span style="color: #66cc66;">!</span> Alerte <span style="color: #66cc66;">!</span></pre></div></div>

<p><code>MonExceptionPerso</code> est de type <code>MonExceptionPerso</code>, donc l&#8217;exception est arrêtée. <code>FillesDeMonExceptionPerso</code> est de type <code>FillesDeMonExceptionPerso</code>, donc l&#8217;exception est arrêtée. <code>FillesDeMonExceptionPerso</code>, qui hérite de <code>MonExceptionPerso</code>, et donc de type <code>MonExceptionPerso</code> est arrêtée.</p>
<p>En revanche, <code>MonExceptionPerso</code> n&#8217;est PAS de type <code>FillesDeMonExceptionPerso</code>. Donc elle n&#8217;est pas arrêtée.</p>
<p>Je le signale car il est très courant de faire des enfants de <code>ValueError</code>, <code>IOError</code>, <code>IndexError</code>, <code>KeyError</code>, etc. et de le lever dans son propre programme. Cela permet à l&#8217;utilisateur de son code de pouvoir attraper soit toutes les erreurs de son code en faisant un <code>except</code> sur l&#8217;enfant, soit attraper toutes les erreurs de type <code>ValueError</code>, <code>IOError</code>, <code>IndexError</code>, <code>KeyError</code> en faisant le <code>except</code> sur le parent. On laisse ainsi une marge de manoeuvre dans la gestion des erreurs.</p>
<h2>Appeler la méthode de la classe parent</h2>
<p>Bon, vous avez overridé une méthode du parent. Mais c&#8217;est une groooooooooooooossse méthode. Vous allez pas la réécrire en entier, si ?</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Escorte<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> calculer_prix<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, heures, tarif<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> heures <span style="color: #66cc66;">*</span> tarif
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EscorteDeLuxe<span style="color: black;">&#40;</span>Escorte<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> calculer_prix<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, heures, tarif, supplement<span style="color: black;">&#41;</span>:
&nbsp;
        tarif =  heures <span style="color: #66cc66;">*</span> tarif
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> tarif + <span style="color: black;">&#40;</span>tarif <span style="color: #66cc66;">*</span> supplement / <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Sur cet exemple éminement intellectuel, <code>calculer_prix()</code> est simple, donc tout réécrire dans <code>EscorteDeLuxe</code> n&#8217;est pas grave. Mais si c&#8217;était une <code>Geisha</code>, hein ? Avec un manuel en Japonais ? </p>
<p>Pour éviter ces problèmes de complexité liés à la globalisation, le perméabilisation des frontières et les sites de streaming, on peut appeler la méthode du parent, dans l&#8217;enfant, en utilisant <code>super()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> EscorteDeLuxe<span style="color: black;">&#40;</span>Escorte<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> calculer_prix<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, heures, tarif, supplement<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># ceci est une manière compliquée de faire Escorte.calculer_prix</span>
        <span style="color: #808080; font-style: italic;"># et de récupérer le résultat</span>
        tarif =  <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>EscorteDeLuxe, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">calculer_prix</span><span style="color: black;">&#40;</span>heures, tarif<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> tarif + <span style="color: black;">&#40;</span>tarif <span style="color: #66cc66;">*</span> supplement / <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span></pre></div></div>

<p>C&#8217;est exactement la même chose que plus haut. Sauf qu&#8217;au lieu de copier / coller le code du parent, on l&#8217;appelle directement.</p>
<p>Je résume :</p>
<ul>
<li>on hérite du parent, et de son code</li>
<li>on override son code, car on veut un comportement différent</li>
<li>mais on veut quand même une partie du comportement du parent</li>
<li>donc dans la méthode de l&#8217;enfant, on appelle la méthode du parent</li>
</ul>
<p>Je réformule : quand vous overridez la méthode du parent dans l&#8217;enfant, celle du parent ne disparait pas. Elle est remplacée uniquement dans l&#8217;enfant. Et vous pouvez toujours vous servir de la version du parent en utilisant <code>super(ClassEncours, self).nom_de_method(arguments)</code> si vous en avez besoin.</p>
<p>Bon, c&#8217;était un gros morceau, et je suis pas sûr de pas être allé trop fort. Donc laissez en comment les remarques sur ce qui pourrait être mieux expliqué. <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-5/">La prochaine fois</a>, on verra des usages poussés comme la composition, la délégation et tous ces trucs d&#8217;un vrai code de production.</p>


feed_id: http://sametmax.com/?p=4352
title: Quels gros sites sont faits en Django ?
uri: Quels-gros-sites-sont-faits-en-Django
url: http://sametmax.com/quels-gros-sites-sont-faits-en-django/
content:
<p>Souvent on me demande une liste de gros sites qui ont été créés avec Django. Il y a bien une liste <a href="http://www.djangosites.org/highest-rated/">ici</a> mais ce ne sont pas vraiment des sites très célèbres.</p>
<p>Voici des exemples plus parlants que des pastebins :</p>
<ul>
<li><a href="http://disqus.com/">Disqus</a></li>
<li><a href="http://pinterest.com">Pinterest</a></li>
<li><a href="http://instagram.com">Instagram</a></li>
<li><a href="http://mahalo.com">Mahalo</a></li>
<li><a href="http://bitbucket.org">bitbucket</a></li>
<li><a href="http://lanyrd.com">lanyrd</a></li>
<li><a href="http://support.mozilla.com">support.mozilla.com</a></li>
<li><a href="http://addons.mozilla.com">addons.mozilla.org</a></li>
<li><a href="http://theonion.com">The Onion</a></li>
<li><a href="http://www.everyblock.com/">EveryBlock</a></li>
<li><a href="http://www.giantbomb.com/">GiantBomb</a></li>
<li><a href="http://www.comicvine.com/">ComicVine</a></li>
<li><a href="http://michaelmoore.com">MichaelMoore.com</a></li>
<li><a href="http://prototype.nytimes.com/represent/">newyorktimes.com</a></li>
<li><a href="http://washingtonpost.com">washingtonpost.com</a></li>
<li><a href="http://guardian.co.uk">guardian.co.uk</a></li>
<li><a href="http://lawrence.com">lawrence.com</a></li>
<li><a href="http://mercedesbenz.com">mercedesbenz.com</a></li>
<li><a href="http://nationalgeographic.com">nationalgeographic.com</a></li>
<li><a href="http://discoverychannel.com">discoverychannel.com</a></li>
<li><a href="http://orange.ch">orange.ch</a></li>
<li><a href="http://developer.vodafone.com">developer.vodafone.com</a></li>
</ul>


feed_id: http://sametmax.com/?p=4361
title: Modèles Django et classes abstraites
uri: Modèles-Django-et-classes-abstraites
url: http://sametmax.com/modeles-django-et-classes-abstraites/
content:
<blockquote><p>    Bonjour Sam &#038; Max,</p></blockquote>
<p><strong>Je suis le génie de la l&#8217;ANPE. Enigma, tu m&#8217;as trouvé, et tu as le droit à 3 voeux.</strong></p>
<blockquote><p>    J&#8217;ai bien aimé votre blog consacré a dynamiser la communauté francophone python et je voudrais vous poser une petite question.<br />
    En fait, Quand il s&#8217;agit d&#8217;écrire un modèle, ce dernier doit hériter de la classe models.Model</p>
<p>    par exemple:<br />
    class Entry(models.Model):</p>
<p>    je me demande pourquoi exactement models.Model ?<br />
    et pourquoi ne pas faire l&#8217;héritage directement comme ça:<br />
    class Entry(Model)</p></blockquote>
<p><strong><br />
Une explication de la syntaxe d&#8217;héritage des modèles Django ? Qu&#8217;il en soit ainsi.</strong></p>
<p>On peut faire les deux. C&#8217;est une question d&#8217;import.</p>
<p>Si tu fais:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> models</pre></div></div>

<p>Tu importes le module <code>models</code>.</p>
<p>Alors si tu veux hériter de la classe <code>Model</code> du module <code>models</code>, tu dois préfixer la classe du module (c&#8217;est ce qu&#8217;on appelle un namespace) : <code>class Entry(models.Model)</code>.</p>
<p>Si par contre tu fais :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Model</pre></div></div>

<p>Tu importes la classe <code>Model</code>. Tu peux donc l&#8217;utiliser directement : <code>class Entry(Model)</code></p>
<p>Le choix entre l&#8217;un et l&#8217;autre est essentiellement une question de style. En Django, pour les modèles on utilise <code>from django import models</code> car on va généralement également utiliser beaucoup de champs (<code>models.IntegerField</code>, <code>models.BooleanField</code>, etc) et que ça évite de tous les importer.</p>
<blockquote><p>Aussi, je voudrais savoir qu&#8217;est ce qu&#8217;une Abstract base class ? ( car je sais que c&#8217;est un peu ça mais j&#8217;arrive pas à faire le lien )</p></blockquote>
<p><strong><br />
Je ne peux pas faire tomber amoureux, ressusciter les morts ni faire des classes abstraites en Python. Mais je peux t&#8217;expliquer pourquoi. Accordé !</strong></p>
<p>Une Abstract Base Class n&#8217;existe pas vraiment en Python. Il y a bien un module <a href="http://docs.python.org/2/library/abc.html?highlight=abc#abc">abc</a> pour les simuler en utilisant des metaclasses, mais il est peu probable que tu en aies jamais besoin.</p>
<p>Dans d&#8217;autres langages, les classes abstraites sont des classes &#8220;à trou&#8221;. C&#8217;est à dire qu&#8217;elles ne sont pas complètes. On en hérite pour récupérer une partie de leur comportement, et on écrit le reste. </p>
<p>Imagine une classe <code>Vehicule</code>, qui sert de classe de base à une classe <code>Voiture</code> et une classe <code>Moto</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Vehicule<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>carburant<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> = carburant</pre></div></div>

<p>Ceci est une classe abstraite. Elle possède des éléments communs à tous les véhicules, mais ne sait pas rouler. Chaque enfant doit implémenter la méthode <code>rouler()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Moto<span style="color: black;">&#40;</span>Vehicule<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> rouler<span style="color: black;">&#40;</span>km<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> -= km <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">3</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Brrrrrrrrrrrrrrrrrr'</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Voiture<span style="color: black;">&#40;</span>Vehicule<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> rouler<span style="color: black;">&#40;</span>km<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">carburant</span> -= km <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">7</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Vrouuuuuuum'</span></pre></div></div>

<p>Une classe abstraite est donc une classe incomplète, utile pour rassembler du code commun aux autres classes, <strong>mais qui ne marche pas d&#8217;elle même.</strong></p>
<p>Dans d&#8217;autres langages, ce concept est formalisé par des mots clés, et des vérifications. Pas en Python : toutes les classes sont égales.</p>
<p>Maintenant le concept des classes abstraites dans Django est une application particulière. Je pense que tu poses la question parce que tu as vu ça :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Vehicule<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> Meta:
&nbsp;
        abstract = <span style="color: #008000;">True</span></pre></div></div>

<p>Dans ce cas particulier, le principe est le même que plus haut, mais appliqué aux models.</p>
<p>L&#8217;ORM de django crée en base de donnée une table par classe qui hérite de <code>models.Model</code>. Ce n&#8217;est pas ce que tu veux pour <code>Vehicule</code> : <code>Vehicule</code> ne marche pas par elle même, aucun intérêt de créer une table pour elle.</p>
<p>Ainsi Django le formalise l&#8217;aspect &#8220;abstrait&#8221; avec un attribut. Si l&#8217;attribut <code>abstract</code> est sur <code>True</code>, Django ne créera pas de table en base de donnée pour ce modèle, car il sait que c&#8217;est une classe abstraite, et qui donc n&#8217;est pas destinée à être utilisée directement. Tous les attributs  du modèle <code>Vehicule</code> qui correspondent à des champs seront copiés dans les enfants, et seront des champs de leurs tables respectives.</p>
<blockquote><p>Je vous remercie d&#8217;avance, et j&#8217;aimerais bien si c&#8217;est possible que la réponse soit comme le prochain sujet comme ça tout le monde en profite. </p></blockquote>
<p><strong><br />
Tes désirs sont des ordres, maître.<br />
</strong><br />
(Comme d&#8217;hab, personne ne fait le v&oelig;u de libérer le génie, hein, bande de connards !)</p>


feed_id: http://sametmax.com/?p=4260
title: La vérité sur le nombre de vues
uri: La-vérité-sur-le-nombre-de-vues
url: http://sametmax.com/la-verite-sur-le-nombre-de-vues/
content:
<p>Que ce soit sur Youtube ou sur votre blog, le nombre de vues est généralement grossièrement surévalué. En effet, les compteurs sont généralement limités à une IP ou un cookie, mais avec une contrainte de temps. Passée cette contrainte, retourner sur la page compte pour une vue de plus.</p>
<p>Or, il y a beaucoup de raisons pour que ce nombre ne corresponde pas au nombre de &#8220;nouvelles vues&#8221; effectif :</p>
<ul>
<li>L&#8217;utilisateur a clické au mauvais endroit et ne voulait pas arriver sur votre site (dans l&#8217;histo, les recherches, le forum, etc). Ca m&#8217;arrive tout le temps.</li>
<li>La relecture : le même mec revient pour voir s&#8217;il n&#8217;a pas raté un truc, lire à tête reposée, finir l&#8217;article, etc. Vous regardez à nouveau votre contenu pour checker.</li>
<li>L&#8217;utilisateur clic, reste 5 secondes et se casse rien qu&#8217;à la gueule du site ou parce que c&#8217;est trop lent à se charger.</li>
<li>L&#8217;utilisateur clic, reste 1 minute et se casse car le sujet ne l&#8217;intéresse pas.</li>
<li>Quelqu&#8217;un vient voir s&#8217;il n&#8217;y a pas un nouveau com ou vient en poster un.</li>
<li>Un lecteur vient sur la page juste pour avoir l&#8217;URL dans la barre d&#8217;adresse et la copier / coller (très fréquent).</li>
<li>Bot (je ne parle PAS des search engine, mais des centaines d&#8217;autres).</li>
</ul>
<p>Bref, il y a probablement la moitié de nos vues qui sont des vues &#8220;artificielles&#8221;, quel que soit le média.</p>
<p>&nbsp;</p>


feed_id: http://sametmax.com/?p=4321
title: Quelle valeur retourner quand on ne trouve rien en Python ?
uri: Quelle-valeur-retourner-quand-on-ne-trouve-rien-en-Python
url: http://sametmax.com/quelle-valeur-retourner-quand-on-ne-trouve-rien/
content:
<p>Hier je me suis dit que maintenant je mettrai de la musique à écouter pendant le tuto. Parce que. Donc détendez-vous avez un petit morceau de K&#8217;s Choice :</p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe width="420" height="315" src="http://www.youtube.com/embed/7kNzDk2CPHI" frameborder="0" scrolling="no" class="iframe-class"></iframe>
<p>Techniquement une fonction Python ne peut pas ne rien retourner. Il n&#8217;existe rien de telle qu&#8217;un procédure dans ce langage. Si vous ne donnez aucune valeur de retour, elle va retourner <code>None</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> metal<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
...     <span style="color: #ff4500;">1</span> + <span style="color: #ff4500;">1</span>
...     
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> metal<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">None</span></pre></div></div>

<p>Ne rien retourner, c&#8217;est donc choisir de retourner <code>None</code>. Or la valeur de retour est un choix d&#8217;API, et va dicter comme les gens vont utiliser votre fonction. Il convient donc de bien choisir sa valeur de retour &#8220;à vide&#8221;.</p>
<h2>Fonction qui produit un résultat</h2>
<p>La fonction qui produit un résultat, par exemple on lui donne deux valeur, et elle calcule une troisième, est le cas le plus facile.</p>
<p>Si la valeur peut être calculée, on retourne la valeur. Sinon, c&#8217;est qu&#8217;il y a un problème avec les arguments. Comme Python n&#8217;est pas un langage compilé, on ne check pas la nature des arguments. De plus parfois ce n&#8217;est pas tant un problème de nature que de valeur (comme le domaine de définition en maths). Dans ce cas, le mieux est de lever une exception (souvent ValueError ou un descendant) :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> by_poison<span style="color: black;">&#40;</span>arg1, arg2<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># faire l'opération ici</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># ah, ça marche pas ?</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;{} et {} doivent être bidule truc sinon ça ne marche pas&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>arg1, arg2<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>On évite la plupart du temps les valeurs qui veulent dire sémantiquement &#8220;mauvaise opération&#8221; comme <code>NaN</code> en Python. On préférera lever une exception. <code>None</code> est rarement une bonne idée ici.</p>
<h2>Fonction qui cherche un résultat</h2>
<p>Ce genre de fonction ne va pas lever une exception sous prétexte qu&#8217;elle n&#8217;a pas trouvé un truc. Ne pas trouver est un état tout à fait normal (à moins que la présence soit requise, mais dans ce cas lever l&#8217;exception ne doit pas être à ce niveau mais à celui plus haut de toute façon).</p>
<p>Si c&#8217;est une vérification de présence, on retourne juste <code>True</code> / <code>False</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> is_inside<span style="color: black;">&#40;</span>value, other_value<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># vérifier que value est dans other value</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span> <span style="color: #808080; font-style: italic;"># ou False</span></pre></div></div>

<p>Notez que si vous faites les choses proprement, il vaut mieux overrider <code>__contains__</code> pour permettre d&#8217;utiliser <code>in</code> directement.</p>
<p>Si votre recherche doit retourner une liste d&#8217;items (comme les lignes dans une base de données), dans ce cas quand on ne trouve rien, il vaut mieux retourner une liste vide. Cela permet de faire une boucle <code>for</code> sur le résultat dans tous les cas sans vérification ni side effect.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> inignition<span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># chercher un truc, et si on trouve le retourner</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># et tout à la fin, au cas où</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Si vous cherchez un élément en particulier (genre un nombre premier dans la liste donnée), le mieux est de retourner <code>None</code> si il ne fait pas partie des données retournable. Si <code>None</code> fait partie des données trouvable, on retourne au fait de lever des exceptions :(. Mais c&#8217;est qu&#8217;il y a un problème ailleurs, car <code>None</code> ne devrait pas être une donnée significative.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> fed<span style="color: black;">&#40;</span>truc, bidule<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># chercher un truc, et si on trouve le retourner</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># et tout à la fin, au cas où</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span></pre></div></div>

<p>Certains cas particuliers demandent de retourner le même type que celui recherché. Il n&#8217;y a pas de règle pour ça, il va falloir utiliser votre tête, pour faire quelque chose de cohérent.</p>
<p>Par exemple, rechercher la chaîne la plus longue dans une séquence doit-il retourner <code>None</code> si aucune n&#8217;est trouvée, ou une chaîne vide ? Il n&#8217;y a pas de bonne réponse, c&#8217;est selon la sémantique de votre appli. Si elle traite uniquement avec des types string, une chaîne vide peut avoir du sens. Si c&#8217;est la présence ou l&#8217;absence de chaîne la plus longue qui est importante, alors <code>None</code> sera plus approprié.</p>
<p>A l&#8217;inverse, des fonctions comme &#8220;trouver la position&#8221; ne doit pas retourner -1 comme dans la plupart des autres langages. -1 est en effet très significatif en Python (pour le slicing par exemple). Évitez donc d&#8217;utiliser le même type pour dire &#8220;rien n&#8217;est trouvé&#8221; si la valeur risque d&#8217;être significative. Dans ce cas choisissez <code>None</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">megalist<span style="color: black;">&#91;</span>:littlelist.<span style="color: black;">search</span><span style="color: black;">&#40;</span>truc<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># si littlelist.search(truc) retourn -1 c'est la merde !</span></pre></div></div>

<p>La bibliothèque Python a tendance à lever des exception à tout va :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = <span style="color: #483d8b;">'Tasse'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> s.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'p'</span><span style="color: black;">&#41;</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-14-e5567af6b163&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    s.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'p'</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">ValueError</span>: substring <span style="color: #ff7700;font-weight:bold;">not</span> found</pre></div></div>

<p>C&#8217;est un comportement acceptable, mais ce n&#8217;est pas le plus pratique. Vous allez voir pourquoi.</p>
<h2>Valeur par défaut</h2>
<p>Retourner <code>None</code> quand on ne trouve rien peut résulter en une API extrêmement agréable car l&#8217;action la plus utilisée comme contre mesure est d&#8217;avoir une valeur par défaut. Prenez pas exemple un dictionnaire. Récupérer un élement et assigner une valeur par défaut si il manque ressemble à ça avec une exception :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> dicos = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'petit larousse'</span> : <span style="color: #483d8b;">'dans la tête'</span>, <span style="color: #483d8b;">'gros robert'</span> : <span style="color: #483d8b;">'dans le derriere'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> dicos<span style="color: black;">&#91;</span><span style="color: #483d8b;">'urban dictionary'</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># un entrée inexistante lève l'exception KeyError</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;ipython-input-18-0d425e038e32&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
    dicos<span style="color: black;">&#91;</span><span style="color: #483d8b;">'urban dictionary'</span><span style="color: black;">&#93;</span>
<span style="color: #008000;">KeyError</span>: <span style="color: #483d8b;">'urban dictionary'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">try</span>: <span style="color: #808080; font-style: italic;"># du coup on doit faire un try</span>
...     <span style="color: black;">ou_ca</span> = dicos<span style="color: black;">&#91;</span><span style="color: #483d8b;">'urban dictionary'</span><span style="color: black;">&#93;</span>
... <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyError</span>:
...     <span style="color: black;">ou_ca</span> = <span style="color: #483d8b;">'sur le net'</span>
...     
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ou_ca
<span style="color: #483d8b;">'sur le net'</span></pre></div></div>

<p>Mais Python permet <a href="http://sametmax.com/ce-que-vous-ne-saviez-pas-sur-les-collections-en-python/">un raccourcis pour ça</a>, vraiment sympas :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> dicos.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'urban dictionary'</span>, <span style="color: #483d8b;">'sur le net'</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'sur le net'</span></pre></div></div>

<p>La méthode <code>get()</code> permet de récupérer une valeur, et si la clé n&#8217;existe pas, elle retourne le deuxième argument. Or, par défaut, le second argument est None :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> dicos.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'urban dictionary'</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">None</span></pre></div></div>

<p>Donc si vous avez une fonction qui cherche quelque chose et qui risque de ne pas trouver, il peut être très pratique de proposer une argument comme valeur de retour par défaut, et de le mettre à <code>None</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> and_blind<span style="color: black;">&#40;</span>cherche, default=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
&nbsp;
     <span style="color: #ff7700;font-weight:bold;">if</span> je_trouve_pas_cherche:
        <span style="color: #ff7700;font-weight:bold;">return</span> default</pre></div></div>


feed_id: http://sametmax.com/?p=4419
title: Un article de cul en 5 secondes
uri: Un-article-de-cul-en-5-secondes
url: http://sametmax.com/un-article-de-cul-en-5-secondes/
content:
<p>Grande inspiration artistique aujourd&#8217;hui.</p>
<div id="attachment_4420" class="wp-caption aligncenter" style="width: 503px"><a href="http://sametmax.com/wp-content/uploads/2013/02/bite-et-seins.png"><img class=" wp-image-4420 " title="Dessiné avec My Paint. Je peux faire une version dédicacée si vous voulez" src="http://sametmax.com/wp-content/uploads/2013/02/bite-et-seins.png" alt="Bites et seins mal dessinés" width="493" height="269" /></a><p class="wp-caption-text">Dessiné avec My Paint. Je peux faire une version dédicacée si vous voulez</p></div>
<p>J&#8217;ai la flemme d&#8217;écrire et je vous emmerde.</p>
<p>Nan revenez, je vous aime !</p>


feed_id: http://sametmax.com/?p=3736
title: Qu’est-ce qu’un flux RSS et à quoi ça sert ?
uri: Qu-est-ce-qu-un-flux-RSS-et-à-quoi-ça-sert
url: http://sametmax.com/quest-ce-quun-flux-rss-et-a-quoi-ca-sert/
content:
<p>RSS est merveilleux, mais une des raisons majeures de son manque d&#8217;adoption, c&#8217;est que personne ne sait à quoi ça sert, malgré son existence depuis, fiouuuuuuu, 1999. L&#8217;année de la sortie du premier épisode de Matrix !</p>
<h2>Ce qu&#8217;est RSS</h2>
<p>RSS est juste un format. Une mise en forme d&#8217;une information. On s&#8217;en sert surtout sur les sites Web.</p>
<p>On parle de flux RSS (ou même de flux atom, qui est une norme similaire et qui marche de la même manière), mais ça ne doit pas vous embrouiller. Le flux RSS est juste &#8220;une sorte de page Web&#8221;, dans un certain format. Il contient des informations qui sont DEJA AILLEURS sur le site. Le flux RSS ne contient que des informations en double, des trucs qui sont déjà publiés.</p>
<p>On peut mettre ce qu&#8217;on veut dans un flux RSS, c&#8217;est l&#8217;auteur du site qui choisit ce qu&#8217;il va mettre dedans.</p>
<p>Par exemple sur notre blog, nous avons <a href="http://sametmax.com/feed/">un flux RSS</a>. Il contient la liste de nos articles publiés, dans l&#8217;ordre de publication. C&#8217;est l&#8217;information qu&#8217;on trouve le plus souvent dans un flux RSS : les dernières publications, dans l&#8217;ordre chronologique.</p>
<h2>Ce que vous pouvez faire avec</h2>
<p>Un flux RSS ne se consulte pas à la main. Vous n&#8217;avez aucun intérêt à le lire comme une page Web.</p>
<p>Pour profiter des avantages d&#8217;un flux RSS, il faut utiliser un logiciel spécialisé dans la lecture des flux RSS. Par exemple, celui intégré dans Firefox, ou un lecteur externe comme <a href="http://www.rssowl.org/">RSSOwl</a>. Personnellement j&#8217;ai une préférence pour <a href="http://lzone.de/liferea/">Liferea</a>. Une autre solution populaire est d&#8217;utiliser une service Web comme <a href="reader.google.com">Google Reader</a> ou <a href="http://rsslounge.aditu.de/">RSS lounge</a>.</p>
<p>Dans tous les cas, vous allez devoir ouvrir votre lecteur de flux RSS, et lui ajouter un abonnement au flux RSS du site que vous voulez consulter. <strong>RSS est une technologie qui suppose un abonnement</strong>. L&#8217;abonnement ne vous engage à rien. Il est anonyme. Il dit juste à votre lecteur de régulièrement télécharger le flux RSS pour vous.</p>
<p>Une fois abonné, votre lecteur de flux RSS va vous afficher le contenu du site : dans le cas de Sam et Max, les derniers articles. Il y a d&#8217;autre usages : sur Github, vous pouvez obtenir un flux RSS des bugs rapportés à votre code, sur Shaarli on y trouve les derniers liens ajoutés, etc.</p>
<p>L’intérêt est que si vous lisez de nombreux sites, vous n&#8217;avez pas besoin de consulter les sites pour savoir ce qu&#8217;il y a de nouveau. Votre lecteur vous fait un résumé de toutes les nouveautés qui sont apparues sur tous les sites depuis votre dernière lecture.</p>
<p>Sur Sam et Max ça veut dire que vous êtes au courant de tout nouvel article publié sans avoir à vous inscrire par mail ou aller régulièrement sur le site. Le lecteur de flux RSS vous tient au courant.</p>
<p>Pour ceux qui font des veilles informationnelles importantes comme moi, ça veut dire un énorme gain de temps : j&#8217;ai les mises à jour de dizaines de sites par jour sans bouger le petit doigt. Je sais exactement lesquels je veux lire, et je peux trier en un clin d&#8217;oeil.</p>
<h2>Voilà ce que ça donne</h2>
<p>D&#8217;abord il faut un site qui ait un flux RSS. C&#8217;est le cas de presque tous les blogs du monde.</p>
<div id="attachment_4431" class="wp-caption aligncenter" style="width: 498px"><a href="http://sametmax.com/wp-content/uploads/2012/12/Espace-de-travail-1_026.jpg"><img class=" wp-image-4431  " title="Vous avez un site que vous lisez souvent ? Cherchez son flux RSS." src="http://sametmax.com/wp-content/uploads/2012/12/Espace-de-travail-1_026.jpg" alt="Capture d'écran du lien RSS de sam et max." width="488" height="253" /></a><p class="wp-caption-text">Vous avez un site que vous lisez souvent ? Cherchez son flux RSS.</p></div>
<p>Ensuite, il faut s&#8217;abonner.</p>
<div id="attachment_4432" class="wp-caption aligncenter" style="width: 438px"><a href="http://sametmax.com/wp-content/uploads/2013/02/Espace-de-travail-1_027.jpg"><img class=" wp-image-4432   " title="L'abonnement consiste juste à donner le lien du flux à votre lecteur. C'est tout." src="http://sametmax.com/wp-content/uploads/2013/02/Espace-de-travail-1_027.jpg" alt="Capture d'écran de l'abonnement à un flux RSS sur liferea" width="428" height="265" /></a><p class="wp-caption-text">L&#39;abonnement consiste juste à donner le lien du flux à votre lecteur. C&#39;est tout.</p></div>
<p>Enfin, une fois par jour, vous ouvrez votre lecteur de flux pour voir ce qu&#8217;il y a de neuf.</p>
<div id="attachment_4433" class="wp-caption aligncenter" style="width: 480px"><a href="http://sametmax.com/wp-content/uploads/2013/02/Espace-de-travail-1_029.jpg"><img class=" wp-image-4433   " title="C'est un peu comme un système de notification. Mais vous le consultez quand vous voulez." src="http://sametmax.com/wp-content/uploads/2013/02/Espace-de-travail-1_029.jpg" alt="Capture d'écran du flux RSS de sametmax.com vu dans liferea" width="470" height="264" /></a><p class="wp-caption-text">C&#39;est un peu comme un système de notification. Mais vous le consultez quand vous voulez.</p></div>
<p>Le flux RSS est un standard ouvert et robuste qui permet à chacun de voir efficacement et rapidement le Web qu&#8217;il veut. Cela demande un peu de temps car il faut ajouter les abonnements (et surtout en supprimer régulièrement pour ne pas crouler sous l&#8217;info inutile) mais après on a son journal le matin, avec le café.</p>
<p>De plus en plus de sites essayent de remplacer le boulot de RSS : pinterest ou le mur facebook. Ces technologies ont un interêt (vos amis font le tri pour vous), mais vous perdez en autonomie si vous n&#8217;utilisez qu&#8217;elles. Utilisez RSS au maximum (même si Twitter ou Facebook font tout pour rendre cela difficile), c&#8217;est une très belle techno, très pratique, très efficace et complètement neutre et libre.</p>
<p>Plus on utilisera RSS, plus il se développera pour des usages nouveaux et tellement pratiques. Sur le blog on a par exemple un flux <a href="https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=sam_et_max">RSS de nos Tweets</a> pour ceux qui n&#8217;ont pas envie de se taper le (long et poussif) chargement de Twitter.</p>
<h2>Un mot aux développeurs</h2>
<p>RSS peut servir à n&#8217;importe quoi qui a besoin de notification : dernières publications, mais aussi messages, alertes d&#8217;état, synchronisation, communication entre process, historiques, timelines&#8230; Tout ce qui est flux d&#8217;information.</p>
<p>Du surcroit, RSS n&#8217;a pas a être statique : vous pouvez très bien générer un RSS à la volée comme un page Web normale en suivant l&#8217;URL, les paramètres POST ou GET, les données en BDD, vos settings, les cookies, l&#8217;âge du capitaine&#8230; Vous pouvez même faire des flux RSS privés, un par user, un pour une team&#8230;</p>
<p><a href="http://sametmax.com/rss-est-une-api/">RSS est une API</a>. Une API fiable, qui marche bien, qu&#8217;on sait traiter. Pas besoin de réinventer la roue. Quand vous créez un service Web, pensez au RSS en premier. L&#8217;API JSON, les fioritures, tout ça c&#8217;est très bien. Mais RSS preums : tous les utilisateurs peuvent le lire, récupérer et backuper. Tous les développeurs peuvent les parser et faire un mashup avec.</p>
<p>RSS (ou atom), c&#8217;est bon. Mangez-en.</p>


feed_id: http://sametmax.com/?p=4445
title: Liste des flux RSS que je suis
uri: Liste-des-flux-RSS-que-je-suis
url: http://sametmax.com/liste-des-flux-rss-que-je-suis/
content:
<p>Dans l&#8217;article d&#8217;hier sur les flux RSS, un lecteur a demandé à ce qu&#8217;on poste les flux que l&#8217;on suit.</p>
<p>Voici la <a href="http://0bin.net/paste/72da87447bd61377a42c4216c99bb732b31f1b82#AaTaFUjknt15V+8VYhE0rRbaUjoBspM3rfyt3IJGlZA=">liste de mes flux en OPML</a>, qui vous permettra de l&#8217;importer dans votre lecteur de flux.</p>
<p>Cette liste change régulièrement, j&#8217;en rajoute, j&#8217;en enlève, certains liens meurent. Globalement elle est beaucoup plus courte qu&#8217;avant : on devient plus exigeant avec le temps, mais on vire aussi les doublons. Par exemple j&#8217;ai viré <a href="lehollandaisvolant.net/">le hollandais volant</a>, <a href="http://ploum.net/">ploum</a> et <a href="http://korben.info/">korben</a>. En effet, <a href="http://sebsauvage.net/">sebsauvage</a> les suit, et il poste les meilleurs articles, donc je bénéficie d&#8217;un filtre automatique puisque je me sens très proche de ses goûts en matière d&#8217;information.</p>
<p>Si je devais garder un seul lien, ce serait sebsauvage. Ce mec est presque mon portail Yahoo à lui tout seul.</p>
<p>Vous noterez la présence de trucs purement ludiques comme les dessins d&#8217;<a href="http://xkcd.com/">XKCD</a> ou <a href="http://www.luc-damas.fr/humeurs/">les humeurs illustrées</a>. Mon conseil, limitez ceux-ci à des sources qui publient peu. Par exemple, j&#8217;ai tenté bashfr une fois. Mauvaise idée, ça tue votre productivité. Oubliez VDM, imgur, etc.</p>
<p>L&#8217;ajout le plus récent à ce RSS est le blog de l&#8217;<a href="http://odieuxconnard.wordpress.com/">odieux connard</a>. Ses articles sont longs, mais tellement bons.</p>
<p>Max ne suis pas de flux RSS manuellement, il utilise le <a href="http://multiboards.net/">multiboards</a>.</p>
<p>P.S : il y a des RSS cachés partout. Vidéos youtube, pull resquest Github, activité flattr, sous-section Reddit&#8230; Arrêtez de faire F5 pour voir si la dernière vidéo du joueur du grenier est en ligne. Utilisez le RSS.</p>


feed_id: http://sametmax.com/?p=4458
title: Se rendre ridicule en 3 étapes
uri: Se-rendre-ridicule-en-3-étapes
url: http://sametmax.com/se-rendre-ridicule-en-3-etapes/
content:
<p><span class="looser"></span><strong>Etape 1 :</strong></p>
<p>S&#8217;exclamer avec une voix insistante : &#8220;Max putain, t&#8217;as pas noté la procédure d&#8217;install de ton nginx custo. Je vais devoir  me retaper tout le setup.&#8221;</p>
<p><strong>Etape 2 :</strong></p>
<p>Terminer son travail avec une voix suffisante : &#8220;Là, tu vois, j&#8217;ai fais un script de déploiement. Ca m&#8217;a pris l&#8217;aprèm, mais maintenant on est tranquille. Faudra le tenir à jour, c&#8217;est tout.&#8221;</p>
<p><strong>Etape 3 :</strong></p>
<p>Dire avec une voix dépitée : &#8220;Et merde, j&#8217;ai fais pas commité le script de déploiement et j&#8217;ai fais un git reset &#8211;hard&#8221;</p>
<p><strong>Optionel :</strong></p>
<p>Répéter avant l&#8217;étape 3 plusieurs fois avec une voix persiflante : &#8220;Arrête de commenter le code ou de le mettre dans des fichiers séparés. Tu peux rien perdre avec Git. Commit, on pourra toujours checkout plus tard.&#8221;</p>


feed_id: http://sametmax.com/?p=4454
uri: ImproperlyConfigured-Error-loading-MySQLdb-module-libmysqlclient_r-s
title:
ImproperlyConfigured: Error loading MySQLdb module: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory

url:
http://sametmax.com/improperlyconfigured-error-loading-mysqldb-module-libmysqlclient_r-so-16-cannot-open-shared-object-file-no-such-file-or-directory/

content:
<p>Poste pense-bête typique.</p>
<p>Cette erreur est liée au module MySQL qui a été compilé avec une version différente de celle qui est actuellement installée sur l&#8217;OS (typiquement dans le cas d&#8217;un vieux <a href="http://sametmax.com/les-environnement-virtuels-python-virtualenv-et-virtualenvwrapper/">virtualenv</a> et d&#8217;une upgrade de système).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pip uninstall mysql-python
easy_install <span style="color: #660033;">-U</span> distribute <span style="color: #666666; font-style: italic;"># optionel, mais dans mon cas nécessaire</span>
pip <span style="color: #c20cb9; font-weight: bold;">install</span> mysql-python</pre></div></div>

<p>Ceci va retirer l&#8217;extension C, et la réinstaller, forçant la recompilation. Le <code>easy_install -U distribute</code> n&#8217;est là que parceque mon virtualenv est tellement vieux que la version de MySQL dessus n&#8217;utilisait pas encore le dernier distribute. Maintenant avec les versions plus récentes, c&#8217;est obligatoire.</p>


feed_id: http://sametmax.com/?p=4478
title: Le vendredi, c’est entre ami
uri: Le-vendredi-c-est-entre-ami
url: http://sametmax.com/le-vendredi-cest-entre-ami/
content:
<p>Qu&#8217;est-ce qui est meilleurs à plusieurs, est facilité par l&#8217;alcool et généralement pratiqué par des gens qui ont une vision tordue des relations humaines ? Le sprint bien entendu.</p>
<p>Vendredi, ce n&#8217;est pas que pour les trolls. C&#8217;est aussi l&#8217;occaz&#8217; de relancer le script &#8220;<code>./biere_pizza.sh --potes --projet</code>&#8220;.</p>
<p>Comme on a des vieux dans l&#8217;équipe, ils ont fait l&#8217;impasse sur la nuit blanche et je poste cet article à seulement 5h du mat. On a même pas un proto qui marche. La honte.</p>
<p>Mais un sprint c&#8217;est aussi (et surtout), le moment de se marrer un bon coup, et pour ça par contre on est super au point.</p>
<p>Donc, résumé de la soirée, en une photo d&#8217;un des postes de &#8220;travail&#8221;:</p>
<div id="attachment_4479" class="wp-caption aligncenter" style="width: 597px"><a href="media/c4616f73.photo.jpg" data-original-source="http://sametmax.com/wp-content/uploads/2013/02/photo.jpg"><img class=" wp-image-4479  " title="Les prothèses mammaires font d'excellents anti-stress" src="media/c4616f73.photo.jpg" data-original-source="http://sametmax.com/wp-content/uploads/2013/02/photo.jpg" alt="Nerf, rubiscube, prothèses mammaire, aspirine et coca-cola" width="587" height="440" /></a><p class="wp-caption-text">Les prothèses mammaires font d&#39;excellents anti-stress</p></div>
<p>Si on finit le proto, promis on vous donne l&#8217;accès en premier (avec un bel article qui présente le concept sous forme de slides corporates incluant des pie charts et des mots comme &#8220;synergie sociale&#8221; et &#8220;proactivité génératrice de buzz&#8221;). Sinon, mieux vaut pas préciser le sujet de notre échec cuisant :-)</p>
<p>Vous l&#8217;aurez compris, ce post est surtout là pour se la péter avec notre vie trop cool, tiser un peu sur un projet qui ne sortira peut être jamais et servir d&#8217;excuse pour poster une photo marrante.</p>
<p>C&#8217;est le WE quoi.</p>
 <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=4478&amp;md5=a6588bf6735a31b7caf7638b1700920e" title="Flattr" target="_blank"><img src="media/fc229d00.flattr-badge-large.png" data-original-source="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>


feed_id: http://sametmax.com/?p=4475
title: Ouvrir un port sur un serveur avec Iptables
uri: Ouvrir-un-port-sur-un-server-avec-Iptables
url: http://sametmax.com/ouvrir-un-port-sur-un-server-avec-iptables/
content:
<p>Dans la série &#8220;les commandes dont je me souviens jamais&#8221;, voici la commande qui permet d&#8217;ouvrir un port sur le firewall iptable de son serveur (il faut les droits admin) :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">iptables <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">7777</span> <span style="color: #660033;">-j</span> ACCEPT <span style="color: #666666; font-style: italic;"># ouvrir le port 777</span>
iptables <span style="color: #660033;">-D</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">7777</span> <span style="color: #660033;">-j</span> ACCEPT <span style="color: #666666; font-style: italic;"># annuler l'ouverture</span>
iptables <span style="color: #660033;">-L</span> <span style="color: #666666; font-style: italic;"># regarder ce qui est ouvert et ce qui l'est pas</span></pre></div></div>

<p>Et après y a des gens qui trouvent que git est cryptique.</p>
<p>Très utile pour la session panique de debuggage en prod sur ce fameux bug aléatoire qui n&#8217;arrive pas sur les machines de dev ni la machine d&#8217;intégration (quand il y en a une&#8230;).</p>
<p>En effet, avec Python et WSGI, tant qu&#8217;on relance pas le process, les changements de codes sont pas pris en compte. Donc je met <code>DEBUG = True</code>, je lance <code>./manage.py <a href="http://pythonhosted.org/django-extensions/">runserver_plus</a> 0.0.0.0:7777</code>, et je debug la prod sans que l&#8217;instance qui sert les clients soient affectées par mes conneries.</p>
 <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=4475&amp;md5=59e93bc2d4f21ef2d325bf23aefc9c56" title="Flattr" target="_blank"><img src="media/fc229d00.flattr-badge-large.png" data-original-source="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>


feed_id: http://sametmax.com/?p=4504
title: Désolé pour le merdouillage dans les URLs
uri: Désolé-pour-le-merdouillage-dans-les-URLs
url: http://sametmax.com/desole-pour-le-merdouillage-dans-les-urls/
content:
<p>Je sais qu&#8217;il y a des gens qui suivent le blog via les emails, et dès que je sauvegarde un mail part avec un lien. Mais parfois je change le lien en route car j&#8217;ai foiré l&#8217;URL (genre j&#8217;ai mis partie 3 sur le dernier article alors que c&#8217;était la partie 5).</p>
<p>Sorry.</p>
 <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=4504&amp;md5=0855e91fca40c281c2a124c384c2185e" title="Flattr" target="_blank"><img src="media/fc229d00.flattr-badge-large.png" data-original-source="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>


feed_id: http://sametmax.com/?p=4495
uri: 2013-02-12-Le-guide-ultime-et-définitif-sur-la-programmation-orientée-objet-en
title:
Le guide ultime et définitif sur la programmation orientée objet en Python à l’usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 5.

url:
http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-5/

content:
<p>Maestro, musique !</p>

<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
<iframe width="420" height="315" src="http://www.youtube.com/embed/XWE_VC9DpK0" frameborder="0" scrolling="no" class="iframe-class"></iframe>
<p>Prérequis :</p>
<ul>
<li>Avoir lu la <a href="http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-4/">partie 4</a>.</li>
<li>Etre bien au point sur la notion de <a href="http://sametmax.com/valeurs-et-references-en-python/">références</a>.</li>
</ul>
<p>La POO, c&#8217;est comme les poupées russes. Une fois qu&#8217;on a maîtrisé un concept, paf, y en a un autre qui se ramène derrière.</p>
<h2>J&#8217;ai plusieurs mamans</h2>
<p>En ces temps de polémique sur l&#8217;autorisation du mariage entre êtres amoureux et consentants (par opposition à celui qu&#8217;on fait par convention sociale depuis des siècles), je vous propose de vous rappeler qu&#8217;une fois de plus les informaticiens sont en avance sur les mœurs.</p>
<p>D&#8217;abord parce qu&#8217;une communauté qui fait autant de links vers <a href="http://www.yougotrickrolled.com/">Never Gona Give You Up</a> est forcément pro gay par essence. Ensuite parce qu&#8217;une classe fille peut avoir plusieurs classes mères sans que ça choque personne.</p>
<p>Prenez ces deux classes qui passaient par là sans rien demander :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MouMoutte<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #008000;">type</span> = <span style="color: #483d8b;">'top'</span> <span style="color: #808080; font-style: italic;"># c'est tip top moumoutte</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Raoul<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    trop = <span style="color: #483d8b;">'cool'</span></pre></div></div>

<p>Hé merde, j&#8217;ai écris ça, et maintenant j&#8217;ai aucune idée de comment faire un code cohérent à partir de cet exemple à la con.</p>
<p>On annule tout.</p>
<p>On recommence.</p>
<p>Vous faites un jeu vidéo. Ça, ça parle bien. Et dedans vous avez des protections et des armes.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Arme<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, degat<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">degat</span> = degat
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> attaque<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cible<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># on retire les degâts de l'épee des points de vie</span>
        cible.<span style="color: black;">vie</span> -= <span style="color: #008000;">self</span>.<span style="color: black;">degat</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Protection<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, armure<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">armure</span> = armure
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> defend<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, degat<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># on diminue les degâts, voire on les annule</span>
&nbsp;
        degat = degat - <span style="color: #008000;">self</span>.<span style="color: black;">armure</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> degat <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> degat
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> epee = Arme<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Epée Mana'</span>, degat=<span style="color: #ff4500;">999</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> casque = Protection<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Casque de Balduran'</span>, armure=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></pre></div></div>

<p>C&#8217;est simpliste, mais vous voyez le tableau. Maintenant un connard de client arrive et vous sort une idée trop cool : il faudrait ajouter un barbare dans le jeu. Qui tape aussi avec son bouclier, parce que la concurrence le fait et qu&#8217;ils veulent pas se faire mettre un vent par Blizzard.</p>
<p>Enfer et Rutabaga ! Comment allons nous nous sortir de cette situation ?</p>
<p>Il y a moult manières de faire, mais l&#8217;une d&#8217;elle est d&#8217;utiliser l&#8217;<strong>héritage multiple</strong>, c&#8217;est-à-dire de créer une classe qui hérite des deux classes en même temps.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ProtectionOffensive<span style="color: black;">&#40;</span>Arme, Protection<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, degat, armure<span style="color: black;">&#41;</span>:
&nbsp;
        Arme.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, degat<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># appelle le __init__ de arme</span>
        Protection.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, armure<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># appelle le __init de protection</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># comme on a appelé les deux __init__, on va avoir les attributs</span>
        <span style="color: #808080; font-style: italic;"># settés dans les deux __init__ attachés à cette classe</span></pre></div></div>

<p>Nous avons alors une classe qui possède les méthodes des deux classes parentes :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> bouclier = ProtectionOffensive<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Bouclier du dragon'</span>, degat=<span style="color: #ff4500;">10</span>, armure=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bouclier.<span style="color: black;">degat</span>
<span style="color: #ff4500;">10</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bouclier.<span style="color: black;">armure</span>
<span style="color: #ff4500;">100</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bouclier.<span style="color: black;">defend</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">0</span></pre></div></div>

<p>Ne cherchez pas compliqué, ça fait exactement ce que ça à l&#8217;air de faire : &#8220;copier&#8221; (oui bon, entre guillemets) le code de chaque parent dans l&#8217;enfant.</p>
<p>Néanmoins vous avez vu qu&#8217;il y a quelques subtilités, notamment la partie <code>__init__</code>.</p>
<p>Posez-vous deux minutes. Respirez. Concentrez-vous. Prêt ?</p>
<p>Les deux classes parentes ont une méthode <code>__init__</code>, mais <strong>Python ne peut en &#8220;copier&#8221; qu&#8217;une seule </strong>dans l&#8217;enfant. Il copie donc la première qu&#8217;il trouve. Il va prendre la liste des parents (ici: <code>Arme, Protection</code>), et la lire de gauche à droite. Il va regarder chaque parent, et si la méthode existe, il va la &#8220;copier&#8221; dans l&#8217;enfant.</p>
<p>Si il retrouve une méthode de même nom dans un des parents suivants, il l&#8217;ignore. (Je dis un DES parents suivants car vous pouvez avoir 10 parents si vous voulez).</p>
<p>Donc dans notre exemple, si je fais :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ProtectionOffensive<span style="color: black;">&#40;</span>Arme, Protection<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p><code>ProtectionOffensive</code> n&#8217;aura que la méthode <code>__init__</code> de <code>Arme</code>. Or ce n&#8217;est pas ce qu&#8217;on veut. On va donc overrider la méthode <code>__init__</code>, et dedans appeler la méthode <code>__init__</code> de <code>Arme</code> ET celle de <code>Protection</code>.</p>
<p>Cette syntaxe : <code>Classe.methode(self, args...)</code> que l&#8217;on retrouve dans <code>Arme.__init__(self, nom, degat)</code> est juste un moyen d&#8217;appeler spécifiquement la méthode du parent.</p>
<p>Dans la partie précédente, je vous ai montré qu&#8217;on pouvait faire cela avec <code>super()</code>. Or <code>super()</code> vous retournera la première méthode du premier parent qu&#8217;elle trouve : c&#8217;est le but de <code>super()</code>, de faire ça automatiquement sans se soucier de savoir qui est le premier parent à avoir une méthode du bon nom.</p>
<p>C&#8217;est utile car parfois c&#8217;est le parent du parent du parent qui a la méthode qu&#8217;on veut appeler. On ne connaît pas forcément son nom, ou alors on ne veut pas l&#8217;écrire en dur. Mais dans notre cas, on veut spécifiquement une méthode d&#8217;un parent en particulier, il faut donc l&#8217;écrire à la main.</p>
<p>D&#8217;une manière générale :</p>
<ul>
<li>Utilisez<code> super()</code> quand vous faites de l&#8217;héritage simple où que vous voulez juste appeler la méthode du premier parent venu sans vous soucier de son nom (car il peut être très haut dans la chaîne d&#8217;héritage).</li>
<li>Utilisez <code>Classe.methode(self, args...)</code> quand vous voulez spécifiquement appeler la méthode d&#8217;un parent en particulier.</li>
</ul>
<p>Faites attention !</p>
<p>Le <code>self</code> n&#8217;est pas au même endroit dans <code>super(ClassCourante, self).methode(args...)</code> et <code>ClasseParente.methode(self, args...)</code>. Et dans le premier cas, on passe la classe courante (que <code>super()</code> va l&#8217;analyser pour trouver les parents automatiquement), dans le cas suivant, on écrit le nom de la classe parente en dur.</p>
<p>Faites quelques tests avec des scripts bidons pour bien comprendre comment ça marche. Faites ça avec des classes toutes simples. Sinon le jour où vous aurez une classe compliquée, vous allez vous embrouiller.</p>
<h2>La composition (POO pour les vrais mecs)</h2>
<p>Jusqu&#8217;ici c&#8217;était un tuto avec des notions de base pour des petits geeks imberbes qui jouent avec des actions figures fabriquées en Chine et achetées sur ebay. Mais maintenant nous allons voir la POO pour les vrais hommes, les barbus, ceux qui jouent avec des <a href="https://www.realdoll.com/">reals dolls</a> et qui n&#8217;ont pas peur de mettre des chaussettes dépareillées.</p>
<p>Voyez-vous, un objet, tout seul, il sert à rien. Il s&#8217;emmerde déjà, rien à foutre le samedi, nul part où sortir, tout ça. Mais surtout, il a personne pour prendre l&#8217;apéro. Non, dans un programme digne d&#8217;un vrai pastis, il faut plusieurs objets qui interagissent entre eux. En fait, plusieurs objets qui s&#8217;utilisent les uns les autres.</p>
<p>Retournez à notre exemple de jeu video :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> HeroViril<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;"># def __init__(self, nom, prenom, groupe_sanguin, signe_astrologique,</span>
    <span style="color: #808080; font-style: italic;">#              couleur_preferee, tendance_sexuelle, culte,</span>
    <span style="color: #808080; font-style: italic;">#              taille_de_la_troisieme_phallange_de_l_index_gauche)</span>
    <span style="color: #808080; font-style: italic;"># TODO : voir le CDC avec le client pour confirmer les attributs du personnage</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, vie, arme=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">vie</span> = vie
        <span style="color: #008000;">self</span>.<span style="color: black;">arme</span> = arme
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> combattre<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ennemi<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} attaque {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span>, ennemi.<span style="color: black;">nom</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">arme</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">arme</span>.<span style="color: black;">attaque</span><span style="color: black;">&#40;</span>ennemi<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> ennemi.<span style="color: black;">vie</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">0</span>:
                <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> ennemi.<span style="color: black;">arme</span>:
                ennemi.<span style="color: black;">arme</span>.<span style="color: black;">attaque</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">vie</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">0</span>:
                <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">vie</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Victoire de {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} est mort comme une pov' merde&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Et là vous notez un truc, c&#8217;est que nous n&#8217;avons pas de méthode <code>attaque()</code> sur notre héros. Nous utilisons la méthode attaque d&#8217;un objet arme. Que l&#8217;on a en attribut.</p>
<p>C&#8217;est cela la composition : un objet, qui en fait est composé de plusieurs sous-objets. Dans notre cas, notre objet héros est aussi composé d&#8217;une arme et d&#8217;une protection, qui sont ses attributs. Il peut ainsi utiliser le comportement de ses objets pour faire le boulot à sa place : c&#8217;est ce qu&#8217;on appelle la délégation.</p>
<p>Reprenons notre code des armes, un peu adapté :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># le code de l'armure ne change pas</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Protection<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, armure<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">armure</span> = armure
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> defend<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, degat<span style="color: black;">&#41;</span>:
&nbsp;
        degat = degat - <span style="color: #008000;">self</span>.<span style="color: black;">armure</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> degat <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> degat
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># on change le code de l'arme, si la cible a une protection</span>
<span style="color: #808080; font-style: italic;"># cela diminue les degâts pris</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Arme<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, degat<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">nom</span> = nom
        <span style="color: #008000;">self</span>.<span style="color: black;">degat</span> = degat
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> attaque<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cible<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># je mets aussi quelques prints pour le lulz</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> cible.<span style="color: black;">protection</span>:
            degat = cible.<span style="color: black;">protection</span>.<span style="color: black;">defend</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">degat</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} - {} = {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>cible.<span style="color: black;">vie</span>, degat, cible.<span style="color: black;">vie</span> - degat<span style="color: black;">&#41;</span>
            cible.<span style="color: black;">vie</span> -= degat
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} - {} = {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>cible.<span style="color: black;">vie</span>, <span style="color: #008000;">self</span>.<span style="color: black;">degat</span>, cible.<span style="color: black;">vie</span> - <span style="color: #008000;">self</span>.<span style="color: black;">degat</span><span style="color: black;">&#41;</span>
            cible.<span style="color: black;">vie</span> -= <span style="color: #008000;">self</span>.<span style="color: black;">degat</span></pre></div></div>

<p>Maintenant créons deux héros, armons-les, et faisons-les combattre :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> gosu = HeroViril<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Drizzt Do'Urden&quot;</span>, <span style="color: #ff4500;">2000</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gosu.<span style="color: black;">arme</span> = Arme<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Lame Vorpale'</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gosu.<span style="color: black;">protection</span> = Protection<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Maille en Kevlar de mithril doré a l'adamantium&quot;</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop = HeroViril<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Bob&quot;</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">arme</span> = Arme<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cure-dent'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">protection</span> = Protection<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Slip&quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">combattre</span><span style="color: black;">&#40;</span>gosu<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># yaaaaaaaaaaaaaaaaaaaaaaa !</span>
&nbsp;
Bob attaque Drizzt Do<span style="color: #483d8b;">'Urden
2000 - 0 = 2000
200 - 9 = 191
2000 - 0 = 2000
191 - 9 = 182
2000 - 0 = 2000
182 - 9 = 173
2000 - 0 = 2000
173 - 9 = 164
2000 - 0 = 2000
164 - 9 = 155
2000 - 0 = 2000
155 - 9 = 146
2000 - 0 = 2000
146 - 9 = 137
2000 - 0 = 2000
137 - 9 = 128
2000 - 0 = 2000
128 - 9 = 119
2000 - 0 = 2000
119 - 9 = 110
2000 - 0 = 2000
110 - 9 = 101
2000 - 0 = 2000
101 - 9 = 92
2000 - 0 = 2000
92 - 9 = 83
2000 - 0 = 2000
83 - 9 = 74
2000 - 0 = 2000
74 - 9 = 65
2000 - 0 = 2000
65 - 9 = 56
2000 - 0 = 2000
56 - 9 = 47
2000 - 0 = 2000
47 - 9 = 38
2000 - 0 = 2000
38 - 9 = 29
2000 - 0 = 2000
29 - 9 = 20
2000 - 0 = 2000
20 - 9 = 11
2000 - 0 = 2000
11 - 9 = 2
2000 - 0 = 2000
2 - 9 = -7
Bob est mort comme une pov'</span> merde</pre></div></div>

<h2>Ok, j&#8217;ai pigé le principe, mais comment ça marche dans le détail ?</h2>
<p>Regardons la méthode combattre de plus près :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #808080; font-style: italic;"># elle attend un ennemi en paramètre, donc UN OBJET HeroViril</span>
    <span style="color: #808080; font-style: italic;"># self est l'objet en cours, donc aussi un objet HeroViril</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> combattre<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ennemi<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} attaque {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span>, ennemi.<span style="color: black;">nom</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># une petite boucle infinie. Warning, c'est un tuto. Ne faites pas</span>
        <span style="color: #808080; font-style: italic;"># ça chez vous les enfants.</span>
        <span style="color: #808080; font-style: italic;"># cette boucle loop pour toujours si il n'y a pas d'attribut arme donc</span>
        <span style="color: #808080; font-style: italic;"># ceci n'est qu'un exemple. Hein ? Noté ? Les deux du fond là ?</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
&nbsp;
            <span style="color: #808080; font-style: italic;"># on donne le premier coup à la personne qui attaque (l'objet en</span>
            <span style="color: #808080; font-style: italic;"># cours). On vérifie qu'il a une arme. Si c'est le cas,</span>
            <span style="color: #808080; font-style: italic;"># on appelle la méthode de l'arme &quot;attaque()&quot;, et on lui passe</span>
            <span style="color: #808080; font-style: italic;"># en paramètre l'ennemi.</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">arme</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">arme</span>.<span style="color: black;">attaque</span><span style="color: black;">&#40;</span>ennemi<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># condition de sortie de la boucle sur la vie du héros qui a pris</span>
            <span style="color: #808080; font-style: italic;"># le coup</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> ennemi.<span style="color: black;">vie</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">0</span>:
                <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># ensuite on fait pareil à l'envers pour donner une chance à l'autre</span>
            <span style="color: #808080; font-style: italic;"># de répliquer : on vérifie que l'ennemi a une arme, et si c'est</span>
            <span style="color: #808080; font-style: italic;"># le cas, on applique la méthode &quot;attaque&quot; de l'arme à l'objet</span>
            <span style="color: #808080; font-style: italic;"># en cours</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> ennemi.<span style="color: black;">arme</span>:
                ennemi.<span style="color: black;">arme</span>.<span style="color: black;">attaque</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># condition de sortie de la boucle sur la vie du héros qui a pris</span>
            <span style="color: #808080; font-style: italic;"># le coup</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">vie</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">0</span>:
                <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># une fois sorti de la boucle, on vérifie le niveau de vie pour</span>
        <span style="color: #808080; font-style: italic;"># désigner le vainqueur</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">vie</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Victoire de {}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;{} est mort comme une pov' merde&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nom</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Donc combattre utilise un objet arme, et appelle sa méthode <code>attaque()</code> sur un héros (j&#8217;ai viré les prints pour rendre le truc plus clair) :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #808080; font-style: italic;"># self est l'objet en cours, donc l'arme</span>
    <span style="color: #808080; font-style: italic;"># cible est un héros, puisqu'on l'a passé en paramètre</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> attaque<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cible<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># si la cible (l'objet héros) a un attribut protection,</span>
        <span style="color: #808080; font-style: italic;"># les dégâts retirés sont diminués (ce calcul est fait par la protection)</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> cible.<span style="color: black;">protection</span>:
            cible.<span style="color: black;">vie</span> -= cible.<span style="color: black;">protection</span>.<span style="color: black;">defend</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">degat</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># sinon, on retire les dégâts à la vie de la cible (le héros)</span>
        <span style="color: #808080; font-style: italic;"># directement</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            cible.<span style="color: black;">vie</span> -= <span style="color: #008000;">self</span>.<span style="color: black;">degat</span></pre></div></div>

<p>Diantre ! La méthode attaque utilise elle-même la méthode <code>defend(</code>) de la protection :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #808080; font-style: italic;"># self est l'objet en cours, donc la protection</span>
    <span style="color: #808080; font-style: italic;"># degat est un simple int</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> defend<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, degat<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># on retourne les degâts infligés, moins la protection</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> degat - <span style="color: #008000;">self</span>.<span style="color: black;">armure</span></pre></div></div>

<p>Pour comprendre tous ces codes, il faut bien piger deux trucs :</p>
<ul>
<li>Il y a 6 objets. Deux héros, deux armes, et deux protections. Les héros ont les armes / protections comme attributs.</li>
<li>On se sert des méthodes des armes pour attaquer. On passe les héros en paramètres à ces méthodes. Les armes se servent des protections des héros pour calculer les dégats.</li>
</ul>
<p>Ce dernier point est le plus important. Si vous comprenez ça, vous avez maîtrisé le plus important de la POO. Relisez le plusieurs fois :</p>
<p>Les héros ont une référence aux armes. Et ensuite, on passe une référence des héros aux armes. Les armes retirent de la vie à ces héros, non sans calculer les dégâts en fonction de la protection qu&#8217;ils portent.</p>
<p>Les objets ont tous des références les uns vers les autres. <strong>Ils se manipulent tous les uns les autres.</strong></p>
<p>Cela fait bizarre car dans la vie une épée ne manipule pas un héros (bon, je connais peu d&#8217;elfes noirs IRL aussi). On comprend facilement qu&#8217;un héros ait un attribut &#8216;épée&#8217;, mais il est difficile de comprendre qu&#8217;une épée ait une méthode, et que le paramètre de cette méthode soit un héros.</p>
<p>C&#8217;est un concept purement informatique : la logique des dégâts est codée dans l&#8217;arme, pas dans le héros. L&#8217;avantage de cette architecture, c&#8217;est que si vous changez l&#8217;arme, vous changez toute la logique des dégâts. Par exemple, vous rajoutez une arme empoisonnée :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ArmeMegaEmpoisonnee<span style="color: black;">&#40;</span>Arme<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, nom, degat, poison=<span style="color: #ff4500;">100000</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>ArmeMegaEmpoisonnee, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>nom, degat<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">poison</span> = poison
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> attaque<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cible<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># on prend les degâts une premiere fois</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>ArmeMegaEmpoisonnee, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">attaque</span><span style="color: black;">&#40;</span>cible<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># puis on prend les dégâts du poison</span>
        cible.<span style="color: black;">vie</span> -= <span style="color: #008000;">self</span>.<span style="color: black;">poison</span></pre></div></div>

<p>Cette arme fait plus de dégâts. Son mécanisme pour faire des dégâts est différent. Il suffit d&#8217;équiper un héros avec l&#8217;arme (en changeant l&#8217;attribut) pour que ce nouveau calcul de dégâts soit pris en compte.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">vie</span> = <span style="color: #ff4500;">200</span> <span style="color: #808080; font-style: italic;"># rePOP !</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">arme</span> = ArmeMegaEmpoisonnee<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Cheat Code'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> noob_qui_repop.<span style="color: black;">combattre</span><span style="color: black;">&#40;</span>gosu<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Vengeance !</span>
Bob attaque Drizzt Do<span style="color: #483d8b;">'Urden
2000 - 0 = 2000
Victoire de Bob</span></pre></div></div>

<p>Ce qu&#8217;il faut retenir : on peut mettre des objets en tant qu&#8217;attributs d&#8217;objets. Il n&#8217;y a pas de limite dans les nombres d&#8217;objets à mettre, leur mélange, les niveaux d&#8217;imbrications, etc. On peut mettre des objets, dans des objets, dans des objets&#8230; C&#8217;est la composition.</p>
<p>Et les objets peuvent utiliser les méthodes des autres objets. Et on peut passer des objets comme paramètres à des méthodes. C&#8217;est la délégation.</p>
<p>C&#8217;est la partouze des objets, quoi.</p>
<p>On peut mettre des objets dans des sets, des dicos, des listes&#8230; Par juste des attributs. Il y en a des choses à faire !</p>
<h2>Choisir entre l&#8217;héritage et la composition</h2>
<p>Les deux techniques permettent de réutiliser du code, mais pas de la même façon. Aucune règle générale ne tient la route dans tous les cas, mais un bon point de départ est de se dire que :</p>
<ul>
<li>Si vous avez deux objets de même nature et que l&#8217;un est une spécialisation de l&#8217;autre (Garçon est une spécialisation de Personne, Voiture est une spécialisation de véhicule, Clio est une spécialisation de voiture, Reptincel est une spécialisation de pokemon, foxmask est une spécialisation du correcteur orthographique de Word, etc), alors utilisez l&#8217;héritage.</li>
<li>Si vous avez deux objets qui échangent des données, qui sont associés ou qui dans la vie réelle sont des &#8216;part de&#8217; (un article est une partie d&#8217;un blog, Raymond Barre est membre d&#8217;un parti, Raymond fait parti d&#8217;un bar, le bar et la raie font parti des poissons, etc), utilisez la composition.</li>
</ul>
<p>Il y a aussi, quelque part, dans le lointain pays des enculeurs de mouche, une différence entre l’agrégation (qu&#8217;on a pas vu) et la composition. Vous vivrez très bien en considérant que c&#8217;est la même chose.</p>
<h2>Le design pattern &#8220;stratégie&#8221;</h2>
<p>Vous entendrez parfois parler du motif de conception &#8220;stratégie&#8221;. C&#8217;est en fait une mise en application abstraite de la composition.</p>
<p>Normalement la composition s&#8217;utilise avec des &#8220;part de&#8221; concrètes. Vous avez une voiture : elle est composée d&#8217;objets pneus, d&#8217;un objet moteur, etc.</p>
<p>Le design pattern stratégie est l&#8217;extraction d&#8217;une part du comportement d&#8217;un objet pour le mettre dans un autre objet, mais la nature de l&#8217;objet importe peu. Ceci est fait purement pour découpler le comportement de l&#8217;objet. </p>
<p>On a vu plus haut que changer l&#8217;arme permet de changer le calcul des dégâts. C&#8217;est ce type de résultat qu&#8217;on vise avec le design pattern strategy.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ParseurXml<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    ...
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ParseurJson<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    ...
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ParseurDeFichier<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    _strategy = <span style="color: black;">&#123;</span> <span style="color: #808080; font-style: italic;"># les stratégie par défaut</span>
        <span style="color: #483d8b;">'json'</span>: ParseurXml,
        <span style="color: #483d8b;">'xml'</span>: ParseurJson
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, fichier, strategy=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">fichier</span> = fichier
        <span style="color: #808080; font-style: italic;"># on récupère l'extension du fichier</span>
        path, ext = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">splitext</span><span style="color: black;">&#40;</span>fichier<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Strategy est une classe de parseur</span>
        <span style="color: #808080; font-style: italic;"># on la récupère depuis les paramètres ou selon</span>
        <span style="color: #808080; font-style: italic;"># l'extension</span>
        Strategy = strategy <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>._strategy<span style="color: black;">&#91;</span>ext.<span style="color: black;">lstrip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        <span style="color: #808080; font-style: italic;"># on instancie notre classe de strategie</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">strategy</span> = Strategy<span style="color: black;">&#40;</span>fichier<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> parse<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># on délègue le boulot à la stratégie</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">strategy</span>.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>La ligne la plus importante est :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">Strategy = strategy <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>._strategy<span style="color: black;">&#91;</span>ext<span style="color: black;">&#93;</span></pre></div></div>

<p>Ici on dit récupérer la stratégie de parsing en paramètre, ou sinon, la bonne en fonction de l&#8217;extension de fichier. On charge donc une classe dynamiquement, on va créer un objet à partir de cette classe. Et c&#8217;est cet objet à qui on va déléguer le comportement du parseur :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #ff7700;font-weight:bold;">def</span> parse<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">strategy</span>.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>On utilise l&#8217;objet dynamiquement pour gérer tout le parsing. On peut ainsi choisir un parseur à la volée.</p>
<p>La pattern strategy mélange donc composition (l&#8217;objet strategy est une part de l&#8217;objet général), délégation (l&#8217;objet général utilise le comportement de l&#8217;objet strategy) et d&#8217;injection de dépendance (on peut changer l&#8217;algo à la volée, il suffit de changer de stratégie).</p>
<p>Bon, ça c&#8217;était le mode hard. C&#8217;est pas grave si vous finissez pas le niveau toute de suite. Mettez pause. Allez pisser un coup et revenez- plus tard, les continues sont infinis sur le blog.</p>
 <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=4495&amp;md5=6dac65ec8e007344d1cfac6f8b8c5402" title="Flattr" target="_blank"><img src="media/fc229d00.flattr-badge-large.png" data-original-source="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>


