<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sam &#38; Max &#187; class</title>
	<atom:link href="http://sametmax.com/tag/class/feed/" rel="self" type="application/rss+xml" />
	<link>http://sametmax.com</link>
	<description>Du code, du cul</description>
	<lastBuildDate>Sat, 07 Nov 2015 10:56:13 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1</generator>
	<item>
		<title>Je n&#8217;expliquerai plus les CBV 17</title>
		<link>http://sametmax.com/je-nexpliquerai-plus-les-cbv/</link>
		<comments>http://sametmax.com/je-nexpliquerai-plus-les-cbv/#comments</comments>
		<pubDate>Mon, 11 May 2015 11:42:49 +0000</pubDate>
		<dc:creator><![CDATA[Sam]]></dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[cbv]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://sametmax.com/?p=16221</guid>
		<description><![CDATA[ Avant, les vues génériques étaient sous forme de fonction, simples, pratiques, c'était parfait. Et ça a été retiré du framework pour des versions OO sous prétexte que c'était plus flexible.

Maintenant, ce sont ces gros tas immondes, avec un ordre d'appel de méthodes complexes, des mixins dans tous les sens et une chaine d'héritage velue. ]]></description>
				<content:encoded><![CDATA[<p>Les <a href="http://sametmax.com/des-vues-normales-aux-vues-generiques-django/">Class Based Views</a> sont des vues génériques réutilisables qui permettent de faire automatiquement des tâches courantes dans Django comme :</p>
<ul>
<li>Récupérer et afficher une ou plusieurs entrées en base de données.</li>
<li>Afficher et valider un formulaire.</li>
<li>Faire un mix des deux pour modifier des entrées en base.</li>
</ul>
<p><a href="http://sametmax.com/des-annees-plus-tards-je-naime-toujours-pas-les-cbv/">Je ne les ai jamais aimées</a>. Avant, les vues génériques étaient sous forme de fonction, simples, pratiques, c&#8217;était parfait. Et ça a été retiré du framework pour des versions OO sous prétexte que c&#8217;était plus flexible.</p>
<p>Maintenant, ce sont ces gros tas immondes, avec un ordre d&#8217;appel de méthodes complexes, des mixins dans tous les sens et une chaine d&#8217;héritage velue. </p>
<p>Je pense que c&#8217;est une bonne occasion pour rappeler que la POO n&#8217;est pas faite pour être utilisée partout, tout le temps. Aucun putain de paradigme de programmation n&#8217;est fait pour être utilisé partout, tout le temps. C&#8217;est pour ça qu&#8217;il y en a plusieurs.</p>
<p>Dans notre cas des CBV, la conséquence est que c&#8217;est <a href="http://sametmax.com/explication-de-code-des-mixins-et-des-decorateurs-de-methode-pour-django/">un enfer</a> pour expliquer tout usage qui ne soit pas un hello world, ce que la doc se garde bien de faire.</p>
<p>Après il y a toujours un malin pour dire &#8220;mais si tu vois tu fais ça, et ça, ça prend 5 lignes, c&#8217;est pas si dur&#8221;. Ouai, maintenant va expliquer ça à un stagiaire, et donne lui un exercice avec une form view qui doit modifier un objet, le lier à un user seulement si il a la permission de le faire. Juste pour voir en combien de temps il trouve. Je vais en WE à Barcelone en attendant. Je prévoie une extension à Rome pour quand il devra relire son code le trimestre prochain.</p>
<p>Et si encore c&#8217;était pour un gain de productivité évident, je fermerais les yeux. Mais c&#8217;est pas le cas. Même moi qui sait utiliser ces&#8230; ces choses&#8230; je dois regarder dans la doc à chaque fois que j&#8217;en utilise une. Et ensuite quand je relis mon code quelques mois plus tard, je chope de pattes d&#8217;oies aux coins des yeux.</p>
<blockquote><p>If you have to refer to the documentation every time you use a module, find (or build) a new module.</p></blockquote>
<p>Dixit Kenneth Reitz, le mec qui a pondu <a href="https://github.com/kennethreitz/requests">requests</a>. Donc on va user something else que les CBV, si vous le voulez bien.</p>
<p>Un lecteur m&#8217;a (encore) pointé du doigt qu&#8217;un schéma du MRO et de l&#8217;ordre d&#8217;appel des méthodes serait utile. Vous vous rendez compte du truc ? On peut comprendre l&#8217;ORM sans schéma alors que c&#8217;est une machine de guerre, et il faut une carte pour comprendre comment faire un listing un peu custo avec une CBV ? J&#8217;ai évalué la somme de travail pour faire ledit schéma, et elle est énorme : trop de classes, trop de méthodes, trop de subtilités.</p>
<p>Bref, je jette le tablier, fuck les CBV. Je ne les inclurai plus dans mes formations, mes tutos, mes aides sur les forums, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://sametmax.com/je-nexpliquerai-plus-les-cbv/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
	<enclosure url="http://sametmax.com/wp-content/uploads/2015/05/9cbXVwS.gif" length="202631" type="image/jpg" />	</item>
		<item>
		<title>Un objet proxy : ce que c&#8217;est et à quoi ça sert 1</title>
		<link>http://sametmax.com/un-objet-proxy-ce-que-cest-et-a-quoi-ca-sert/</link>
		<comments>http://sametmax.com/un-objet-proxy-ce-que-cest-et-a-quoi-ca-sert/#comments</comments>
		<pubDate>Sat, 01 Feb 2014 17:18:13 +0000</pubDate>
		<dc:creator><![CDATA[Sam]]></dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[objet]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://sametmax.com/?p=8076</guid>
		<description><![CDATA[Un objet proxy est un objet qui prend un <strong>autre</strong> objet en paramètre et le sauvegarde dans un de ses attributs. Quand on appelle les méthodes du proxy, le proxy appelle la même méthode de l'objet qu'il a en attribut, et retourne le résultat. Quand on set/get/delete un attribut du proxy, il fait la même chose sur l'autre objet.]]></description>
				<content:encoded><![CDATA[<p>Un objet proxy est un objet qui prend un <strong>autre</strong> objet en paramètre et le sauvegarde dans un de ses attributs. Quand on appelle les méthodes du proxy, le proxy appelle la même méthode de l&#8217;objet qu&#8217;il a en attribut, et retourne le résultat. Quand on set/get/delete un attribut du proxy, il fait la même chose sur l&#8217;autre objet.</p>
<p>Voilà une implémentation très basique d&#8217;un objet proxy en Python :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Proxy<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><span style="color: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># L'objet passé en paramètre est</span>
        <span style="color: #808080; font-style: italic;"># sauvegardé dans un attribut.</span>
        <span style="color: #808080; font-style: italic;"># On le fait en utilisant </span>
        <span style="color: #808080; font-style: italic;"># object.__setattr__, qui est le</span>
        <span style="color: #808080; font-style: italic;"># __setattr__ du parent, et non directement</span>
        <span style="color: #808080; font-style: italic;"># en faisant self._obj = obj</span>
        <span style="color: #808080; font-style: italic;"># afin d'éviter une boucle infinie car</span>
        <span style="color: #808080; font-style: italic;"># nous écrasons __setattr__ plus bas.</span>
        <span style="color: #008000;">object</span>.<span style="color: #0000cd;">__setattr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># On écrase les méthodes magiques __getattribute__</span>
    <span style="color: #808080; font-style: italic;"># (qui est appelée quand on faire self.nom_attribut), </span>
    <span style="color: #808080; font-style: italic;"># __delattr__ (qui est appelée quand on fait </span>
    <span style="color: #808080; font-style: italic;"># del self.nom_attribut) et __setattr__ (qui est </span>
    <span style="color: #808080; font-style: italic;"># appelée quand on fait self.nom_attribut = truc)</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__delattr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">delattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__setattr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> value<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">setattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> value<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Ca s&#8217;utilise comme ceci :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> UnObjetOrdinnaire<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    attribut <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'VALEUR !'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> methode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> param<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> param * <span style="color: #ff4500;">2</span>
&nbsp;
&nbsp;
objet_ordinnaire <span style="color: #66cc66;">=</span> UnObjetOrdinnaire<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># on passe l'objet ordinnaire au proxy</span>
objet_proxy <span style="color: #66cc66;">=</span> Proxy<span style="color: black;">&#40;</span>objet_ordinnaire<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Accéder à des méthodes et attribut</span>
<span style="color: #808080; font-style: italic;"># du proxy accède à ceux de l'objet</span>
<span style="color: #808080; font-style: italic;"># derrière le proxy</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>objet_proxy.<span style="color: black;">attribut</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">## VALEUR !</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>objet_proxy.<span style="color: black;">methode</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">## 6</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Modifier l'objet proxy modifie</span>
<span style="color: #808080; font-style: italic;"># l'objet derrière le proxy</span>
objet_proxy.<span style="color: black;">attribut</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'une autre valeur'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>objet_ordinnaire.<span style="color: black;">attribut</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">## une autre valeur</span></pre></td></tr></table></div>

<p>Pour un exemple vraiment à l&#8217;épreuve des balles, il faut prendre en compte tout un tas de <a href="http://code.activestate.com/recipes/496741-object-proxying/">cas particuliers</a>, ce qui fait qu&#8217;il est bien plus rentable d&#8217;utiliser une <a href="https://pypi.python.org/pypi/ProxyTypes">lib solide</a> pour ça.</p>
<p><strong>Attention, un objet proxy peut très bien avoir des méthodes qui n&#8217;appellent pas celles de l&#8217;objet derrière. On même avoir des méthodes qui appellent des méthodes qui n&#8217;ont pas le même nom, ou plusieurs méthodes&#8230;</strong> Ce que vous voyez en exemple est un proxy très basique.</p>
<h2>Pourquoi voudrait-on obtenir ce résultat ?</h2>
<p>Plusieurs design patterns font appel à des objets proxy. Par exemple, le design pattern &#8220;adapter&#8221; consiste à créer un objet proxy qui accepte plusieurs types d&#8217;objets en paramètres afin de présenter toujours la même interface.</p>
<p>Imaginez que vous ayez plusieurs objets qui servent à s&#8217;authentifier :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Login<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    _is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> is_logged<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>._is_logged
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> login<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">email</span><span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> LoginWithUsername<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    _is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> is_logged<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>._is_logged
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> login<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> username<span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SignIn<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    _is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> is_logged<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>._is_logged
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> signin<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">email</span><span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> LoginWithKey<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    _is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span> 
&nbsp;
    key <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;jfjkdlmqfjdmqsjdk&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> is_logged<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>._is_logged
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> login<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._is_logged <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span></pre></td></tr></table></div>

<p>Et vous avez un algo de parsing, qui attend un objet d&#8217;authentification. Si vous mettez le code qui permet de choisir la bonne API dans l&#8217;algo de parsing, vous liez l&#8217;algo (qui n&#8217;a rien à voir avec l&#8217;authentification) à toutes ces implémentations.</p>
<p>Une des manières de faire, est d&#8217;utiliser un adaptateur, dont  voici une esquisse :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> AuthAdapter<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: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">object</span>.<span style="color: #0000cd;">__setattr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #808080; font-style: italic;"># Si l'attribut existe sur le proxy, on l'utilise</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">AttributeError</span>:
            <span style="color: #808080; font-style: italic;"># Sinon on tente le coup sur l'objet derrière le proxy</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> login<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> id_<span style="color: #66cc66;">=</span><span style="color: #008000;">None</span><span style="color: #66cc66;">,</span> secret<span style="color: #66cc66;">=</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># Le login est différent pour chaque classe,</span>
        <span style="color: #808080; font-style: italic;"># donc on s'arrange avec.</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #008000;">self</span>._obj.<span style="color: black;">login</span><span style="color: black;">&#40;</span>id_<span style="color: #66cc66;">,</span> secret<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">AttributeError</span>:
            <span style="color: #008000;">self</span>._obj.<span style="color: black;">signin</span><span style="color: black;">&#40;</span>id_<span style="color: #66cc66;">,</span> secret<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">TypeError</span>:
            <span style="color: #008000;">self</span>._obj.<span style="color: black;">login</span><span style="color: black;">&#40;</span>id_<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>En gros, si on essaye d&#8217;appeler <code>login()</code>, il va lisser les contours et nous donner toujours la même interface, même si derrière l&#8217;objet peut marcher complètement différement. En revanche, si on appelle n&#8217;importe quel autre attribut ou méthode (par exemple <code>is_logged</code>, mais il pourrait y en avoir des dizaines d&#8217;autres dans la vrai vie vivante), ça tape directement dans l&#8217;objet derrière le proxy.</p>
<p>Donc si j&#8217;applique l&#8217;adaptateur systématiquement, quelle que soit la classe derrière, le comportement est toujours le même : j&#8217;appelle <code>login(un id, un secret)</code>, et il se logge.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">all_auth <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span>Login<span style="color: #66cc66;">,</span> LoginWithUsername<span style="color: #66cc66;">,</span> SignIn<span style="color: #66cc66;">,</span> LoginWithKey<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> auth <span style="color: #ff7700;font-weight:bold;">in</span> all_auth:
    <span style="color: #808080; font-style: italic;"># 'auth' est une des 4 classes de login. On l'instancie et</span>
    <span style="color: #808080; font-style: italic;"># on met l'instance derrière le proxy</span>
    auth <span style="color: #66cc66;">=</span> AuthAdapter<span style="color: black;">&#40;</span>auth<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Testing '%s'&quot;</span> % auth.__class__.__name__<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Is logged : %s&quot;</span> % auth.<span style="color: black;">is_logged</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># Le login se passe toujours de la même manière, quelle que soit la classe</span>
    auth.<span style="color: black;">login</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'id'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'secret'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Is logged after logging : %s&quot;</span> % auth.<span style="color: black;">is_logged</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p> Comme d&#8217;habitude, ceci est un exemple naval. Il est bateau quoi. Mais cela vous démontre le principe.</p>
<p> Le design pattern façade ressemble à l&#8217;adapter, en fait c&#8217;est une spécialisation de l&#8217;adapter. Il s&#8217;agit juste d&#8217;exposer une interface plus simple, de l&#8217;objet derrière le proxy.</p>
<p>Un proxy peut aussi servir à hacker une lib. Par exemple, la lib attend un objet d&#8217;une ancienne version d&#8217;une autre lib dont l&#8217;auteur a déprécié un attribut. Avec un proxy, vous pouvez toujours faire semblant que l&#8217;attribut est toujours là : enrobez l&#8217;objet dans un proxy qui possède cet attribut, tout le reste de l&#8217;API sera la même.</p>
<p>Un proxy peut également être utile si vous voulez effectuer des actions quand l&#8217;objet est manipulé.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ProxyLogger<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><span style="color: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">object</span>.<span style="color: #0000cd;">__setattr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: #66cc66;">,</span> obj<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span>:
        obj <span style="color: #66cc66;">=</span> <span style="color: #008000;">object</span>.<span style="color: #0000cd;">__getattribute__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_obj&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># On lance un warning à chaque accès à un attribut de l'objet</span>
        <span style="color: #808080; font-style: italic;"># derrière le proxy</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">warning</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.%s has been called&quot;</span> % <span style="color: black;">&#40;</span>obj.__class__.__name__<span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>obj<span style="color: #66cc66;">,</span> name<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Maintenant, supposons que vous avez un objet d&#8217;une lib externe (que vous ne pouvez donc pas modifier) sur lequel vous avez besoin d&#8217;infos :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ObjetExterne<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> ahahah<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;">pass</span>
&nbsp;
o <span style="color: #66cc66;">=</span> ProxyLogger<span style="color: black;">&#40;</span>ObjetExterne<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
o.<span style="color: black;">ahahah</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">## WARNING:root:ObjetExterne.ahahah has been called</span></pre></td></tr></table></div>

<p>Vous pouvez refiler le proxy à n&#8217;importe quel objet de sa lib d&#8217;origine, si le proxy est bien fait, elle ne vera pas la différence.</p>
<p>On finit sur une note culture, puisque le pattern decorator utilise souvent aussi un proxy. Cette fois d&#8217;une fonction sur un autre objet (en générale une autre fonction). Mais le principe est le même. Donc quand vous voyez <a href="http://sametmax.com/comprendre-les-decorateurs-python-pas-a-pas-partie-1/">@un_decorateur</a>, il est peut être en train d&#8217;appliquer un proxy à la fonction.</p>
<p>D&#8217;ailleurs on dit souvent que le proxy <strong>décore</strong> l&#8217;objet qui est derrière. </p>
]]></content:encoded>
			<wfw:commentRss>http://sametmax.com/un-objet-proxy-ce-que-cest-et-a-quoi-ca-sert/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://sametmax.com/wp-content/uploads/2014/02/v1sV4jN.jpg" length="128340" type="image/jpg" />	</item>
		<item>
		<title>Le guide ultime et définitif sur la programmation orientée objet en Python à l&#8217;usage des débutants qui sont rassurés par les textes détaillés qui prennent le temps de tout expliquer. Partie 1. 38</title>
		<link>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/</link>
		<comments>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/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 07:30:56 +0000</pubDate>
		<dc:creator><![CDATA[Sam]]></dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://sametmax.com/?p=4134</guid>
		<description><![CDATA[Je viens de dire que c'était 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. Je peux pas faire titre plus explicite, si ?]]></description>
				<content:encoded><![CDATA[<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 vôtres.</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"><table><tr><td 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 <span style="color: #66cc66;">=</span> 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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x3112440</span><span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td 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></td></tr></table></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"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> object_tout_neuf <span style="color: #66cc66;">=</span> DescriptionDeLObject<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></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 issu 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"><table><tr><td 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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x3112440</span><span style="color: #66cc66;">&gt;</span></pre></td></tr></table></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"><table><tr><td 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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x31c1d40</span><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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x31d6cf8</span><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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x31d6bd8</span><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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x31d6c68</span><span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td 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></td></tr></table></div>

<p>Nous avons créé 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"><table><tr><td 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><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</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></td></tr></table></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 une méthode, il nous faut forcément une instance :</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> objet_tout_neuf <span style="color: #66cc66;">=</span> 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></td></tr></table></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"><table><tr><td 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 <span style="color: #66cc66;">=</span> 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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x3429170</span><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><span style="color: #dc143c;">__main__</span>.<span style="color: black;">DescriptionDeLObject</span> instance at <span style="color: #ff4500;">0x3429170</span><span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td 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></td></tr></table></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"><table><tr><td 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 <span style="color: #66cc66;">=</span> 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><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</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></td></tr></table></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"><table><tr><td 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></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">variable <span style="color: #66cc66;">=</span> 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></td></tr></table></div>

<h2>Conventions</h2>
<p>En Python, peu de choses sont forcées. La plupart des 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 surprenante 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"><table><tr><td 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></td></tr></table></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. Hé bien les attributs sont juste des variables attachées à 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"><table><tr><td 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><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</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: #66cc66;">=</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></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td 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: #66cc66;">=</span> <span style="color: #483d8b;">&quot;autre valeur&quot;</span></pre></td></tr></table></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"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object <span style="color: #66cc66;">=</span> 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><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</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><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">5</span><span style="color: #66cc66;">,</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: #66cc66;">=</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></td></tr></table></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"><table><tr><td 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: #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: #66cc66;">,</span> valeur<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">un_attribut</span> <span style="color: #66cc66;">=</span> valeur * <span style="color: #ff4500;">2</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> ze_object <span style="color: #66cc66;">=</span> 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: #66cc66;">=</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></td></tr></table></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 un état de départ à tout nouvel objet créé. Par exemple, si vous travaillez sur un jeu vidéo de course de voitures, 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 définissez 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"><table><tr><td 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 <span style="color: #66cc66;">=</span> 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></td></tr></table></div>

<p><code>__init__</code> est une méthode tout à fait ordinaire. Seul le nom est important: comme elle est appelée ainsi, Python la 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"><table><tr><td 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: #66cc66;">=</span> <span style="color: #ff4500;">100</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;noire&quot;</span>
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v <span style="color: #66cc66;">=</span> 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></td></tr></table></div>

<p>Bien entendu, on veut généralement pouvoir 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"><table><tr><td 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: #66cc66;">,</span> combien_de_carburant<span style="color: #66cc66;">=</span><span style="color: #ff4500;">100</span><span style="color: #66cc66;">,</span> quelle_couleur<span style="color: #66cc66;">=</span><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> <span style="color: #66cc66;">=</span> combien_de_carburant
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> <span style="color: #66cc66;">=</span> quelle_couleur
&nbsp;
&nbsp;
<span style="color: #66cc66;">&gt;&gt;&gt;</span> v1 <span style="color: #66cc66;">=</span> 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 <span style="color: #66cc66;">=</span> Voiture<span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: #66cc66;">,</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 <span style="color: #66cc66;">=</span> Voiture<span style="color: black;">&#40;</span>quelle_couleur<span style="color: #66cc66;">=</span><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></td></tr></table></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ée automatiquement après que l&#8217;objet soit créé, et on lui passe les paramètres passés à l&#8217;instanciation. Comme <code>__init__</code> est une méthode et a accès à l&#8217;instance 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"><table><tr><td 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: #66cc66;">,</span> carburant<span style="color: #66cc66;">=</span><span style="color: #ff4500;">100</span><span style="color: #66cc66;">,</span> couleur<span style="color: #66cc66;">=</span><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> <span style="color: #66cc66;">=</span> carburant
        <span style="color: #008000;">self</span>.<span style="color: black;">couleur</span> <span style="color: #66cc66;">=</span> couleur</pre></td></tr></table></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érencie.</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ée 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>.<br />
<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/"><br />
La partie 2</a>, c&#8217;est par ici.</p>
]]></content:encoded>
			<wfw:commentRss>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/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
	<enclosure url="http://sametmax.com/wp-content/uploads/2013/01/michel-ange.jpg" length="19849" type="image/jpg" />	</item>
	</channel>
</rss>