<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://haypo.alwaysdata.net:443/wiki/skins/common/feed.css?63"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Python ou rien - Historique des versions</title>
		<link>http://haypo.alwaysdata.net:443/wiki/index.php?title=Python_ou_rien&amp;action=history</link>
		<description>Historique pour cette page sur le wiki</description>
		<language>fr</language>
		<generator>MediaWiki 1.10.1</generator>
		<lastBuildDate>Tue, 16 Jun 2026 09:52:51 GMT</lastBuildDate>
		<item>
			<title>Haypo le 12 août 2006 à 01:44</title>
			<link>http://haypo.alwaysdata.net:443/wiki/index.php?title=Python_ou_rien&amp;diff=5927&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[CatÃ©gorie:Langage de programmation]]&lt;br /&gt;
{{Retour|Langage de programmation|Retour aux langages de programmation}}&lt;br /&gt;
&lt;br /&gt;
Ce document se veut Ãªtre un document concis expliquant pourquoi [[Python]] est un langage surpuissant :-) (rien que Ã§a !)&lt;br /&gt;
&lt;br /&gt;
== Structures de donnÃ©es ==&lt;br /&gt;
&lt;br /&gt;
Les tableaux (Ã©galement appelÃ©s vecteurs ou listes), les dictionnaires (tableaux associatifs) et chaÃ®nes de caractÃ¨res existent de base. Ce n'est pas une bibliothÃ¨que externe comme en [[Cpp|C++]] par exemple. De plus, ce sont des objets, on peut donc leur appliquer des mÃ©thodes :&lt;br /&gt;
 # '''ChaÃ®ne de caractÃ¨re''' : Affiche &amp;quot;Bonjour Victor&amp;quot;&lt;br /&gt;
 print &amp;quot; Hello Victor &amp;quot;.replace(&amp;quot;Hello&amp;quot;, &amp;quot;Bonjour&amp;quot;).strip()&lt;br /&gt;
 &lt;br /&gt;
 # '''Tableau''' : Affiche [1, 3]&lt;br /&gt;
 nombres = [1]&lt;br /&gt;
 nombres.extend([2, 3])&lt;br /&gt;
 nombres.remove(2)&lt;br /&gt;
 print nombres&lt;br /&gt;
 &lt;br /&gt;
 # '''Dictionnaire''' : Affiche &amp;quot;one&amp;quot;&lt;br /&gt;
 anglais = {1: &amp;quot;one&amp;quot;, 2: &amp;quot;two&amp;quot;}&lt;br /&gt;
 print anglais[1]&lt;br /&gt;
D'ailleurs, on peut utiliser l'[[Unicode et UTF-8|unicode]] sans difficultÃ© : voir la notation Â« u&amp;quot;accentuÃ©&amp;quot; Â», la mÃ©thode Â« &amp;quot;accentuÃ©&amp;quot;.decode(&amp;quot;utf-8&amp;quot;) Â» et la fonction Ã©quivalente Â« unicode(&amp;quot;accentuÃ©&amp;quot;, &amp;quot;utf-8&amp;quot;) Â». Il existe Ã©galement les tuples qui sont des tableaux de taille fixe (exemple : (1, 2, 3)) qui utilisent moins d'espace mÃ©moire.&lt;br /&gt;
&lt;br /&gt;
Les tableaux et tuples sont trÃ¨s bien intÃ©grÃ©s dans le langage. On peut assigner plusieurs valeurs Ã  la fois et une fonction peu renvoyer plusieurs valeurs trÃ¨s naturellement.&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; x, y, z = 10, 5, 2&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def div_mod(x, y):&lt;br /&gt;
 ...   return x/y, x%y&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; div_mod(14, 5)&lt;br /&gt;
 (2, 4)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; texte = &amp;quot;Tout est bon dans le Python&amp;quot;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; tout_est_bon, python = texte[:12], texte[21:]&lt;br /&gt;
&lt;br /&gt;
== GÃ©nÃ©rateur et boucle Â« pour chaque Â» ==&lt;br /&gt;
&lt;br /&gt;
Â« GÃ©nÃ©rateur Â» avec la mÃ©thode ''yield'' et boucle Â« pour chaque Â» (Â« for each Â» en anglais) avec ''for x in â€¦'' :&lt;br /&gt;
 def fibonacci():&lt;br /&gt;
     a = 0&lt;br /&gt;
     b = 1&lt;br /&gt;
     while True:&lt;br /&gt;
         '''yield''' a&lt;br /&gt;
         a, b = b, a+b&lt;br /&gt;
 &lt;br /&gt;
 n = 0&lt;br /&gt;
 '''for x in fibonacci()''':&lt;br /&gt;
     print &amp;quot;u(%s)=%s&amp;quot; % (n, x)&lt;br /&gt;
     n = n + 1&lt;br /&gt;
     if n == 10:&lt;br /&gt;
         break&lt;br /&gt;
La fonction ''fibonacci'' renvoie un Â« gÃ©nÃ©rateur Â» qui peut Ãªtre lu comme on lirait un fichier et est infini. Nul besoin de stocker les (deux) termes de la [http://fr.wikipedia.org/wiki/Suite_de_Fibonacci suite de l'italien surnommÃ© ''Fibonacci''], Python le fait pour nous.&lt;br /&gt;
&lt;br /&gt;
Autre exemple avec la boucle Â« pour chaque Â», numÃ©rotation d'un fichier texte :&lt;br /&gt;
 n = 1&lt;br /&gt;
 '''for ligne in''' ''open(&amp;quot;fichier.txt&amp;quot;, &amp;quot;r&amp;quot;).readlines()'':&lt;br /&gt;
     print &amp;quot;%u: %s&amp;quot; % (n, ligne.rstrip(&amp;quot;\r\n&amp;quot;))&lt;br /&gt;
     n += 1&lt;br /&gt;
&lt;br /&gt;
== Langage dynamique ==&lt;br /&gt;
&lt;br /&gt;
=== Introspection ===&lt;br /&gt;
&lt;br /&gt;
Exemple d'introspection :&lt;br /&gt;
 class Personne:&lt;br /&gt;
     def __init__(self, prenom, nom):&lt;br /&gt;
         self.prenom = prenom&lt;br /&gt;
         self.nom = nom&lt;br /&gt;
 &lt;br /&gt;
     def __str__(self):&lt;br /&gt;
         return &amp;quot;%s %s&amp;quot; % (self.prenom, self.nom)&lt;br /&gt;
 &lt;br /&gt;
 # Ajoute un attribut non prÃ©vu dans la classe&lt;br /&gt;
 victor = Personne(&amp;quot;Victor&amp;quot;, &amp;quot;Stinner&amp;quot;)&lt;br /&gt;
 victor.age = 22&lt;br /&gt;
 &lt;br /&gt;
 # Modification et lecture d'un attribut en donnant son nom&lt;br /&gt;
 # sous forme d'une chaÃ®ne de caractÃ¨re&lt;br /&gt;
 '''setattr'''(victor, &amp;quot;age&amp;quot;, victor.age+1)&lt;br /&gt;
 print &amp;quot;%s a %s ans&amp;quot; % (victor, '''getattr'''(victor, &amp;quot;age&amp;quot;))&lt;br /&gt;
 &lt;br /&gt;
 # On peut avoir la liste des attributs d'une classe avec :&lt;br /&gt;
 print victor'''.__dict__'''&lt;br /&gt;
&lt;br /&gt;
RÃ©sultat :&lt;br /&gt;
 Victor Stinner a 23 ans&lt;br /&gt;
 {'nom': 'Stinner', 'age': 23, 'prenom': 'Victor'}&lt;br /&gt;
&lt;br /&gt;
'''Voir aussi le module ''inspect''.'''&lt;br /&gt;
&lt;br /&gt;
=== Typage dynamique ===&lt;br /&gt;
&lt;br /&gt;
Changement de type automatique :&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; n=10&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; type(n)&lt;br /&gt;
 &amp;lt;type 'int'&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; n = n*100000000000000000000&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; type(n)&lt;br /&gt;
 &amp;lt;type 'long'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MÃ©thode qui s'en fiche du type, appellÃ©e Â« ''template'' Â» en C++ ou encore mÃ©thode ''gÃ©nÃ©rique'' :&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; liste=[]&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def ajoute(x):&lt;br /&gt;
 ...     liste.append(x)&lt;br /&gt;
 ... &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; ajoute(10)                  # Ajoute un nombre&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; ajoute(&amp;quot;abc&amp;quot;)               # Ajoute une chaÃ®ne de caractÃ¨res&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; ajoute({&amp;quot;blanc&amp;quot;: &amp;quot;noir&amp;quot;})   # Ajoute un dictionnaire&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print liste&lt;br /&gt;
 [10, 'abc', {'blanc': 'noir'}&lt;br /&gt;
&lt;br /&gt;
== Surchage d'opÃ©rateur ==&lt;br /&gt;
&lt;br /&gt;
Python donne la possibilitÃ© de faire de la programmation orientÃ©e objet. Beaucoup d'opÃ©rateurs et fonctions sont surchargeables :&lt;br /&gt;
 class ObjetEnPython:&lt;br /&gt;
     # Constructeur&lt;br /&gt;
     def '''__init__'''(self):&lt;br /&gt;
         self.items = [1, 2, 3]&lt;br /&gt;
 &lt;br /&gt;
     # Destructeur&lt;br /&gt;
     def '''__del__'''(self):&lt;br /&gt;
         print &amp;quot;BOUM&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;cmp(p1, p2)&amp;quot;, exemple : tri d'une liste de p avec sort()&lt;br /&gt;
     def '''__cmp__'''(a, b):&lt;br /&gt;
         return cmp(a.items, b.items)&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;str(p)&amp;quot;, exemple : &amp;quot;print p&amp;quot;&lt;br /&gt;
     def '''__str__'''(self):&lt;br /&gt;
         return &amp;quot;liste = %s&amp;quot; % self.items&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;len(p)&amp;quot;&lt;br /&gt;
     def '''__len__'''(self):&lt;br /&gt;
         return len(self.items)&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;p[x]&amp;quot;&lt;br /&gt;
     def '''__getitem__'''(self, key):&lt;br /&gt;
         return self.items[key]&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;x in p&amp;quot;&lt;br /&gt;
     def '''__contains__'''(self, value):&lt;br /&gt;
         return (value in self.items)&lt;br /&gt;
 &lt;br /&gt;
     # UtilisÃ© pour : &amp;quot;for x in p&amp;quot;&lt;br /&gt;
     def '''__iter__'''(self):&lt;br /&gt;
         for x in self.items:&lt;br /&gt;
             yield x&lt;br /&gt;
On peut Ã©galement surcharger les opÃ©rateurs arithmÃ©tiques (a+b, a*b, ...). Quelques jolis exemples (dans l'interprÃ©teur Python) :&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print &amp;quot;zZ&amp;quot; * 3          # Surchage de l'opÃ©rateur a*b&lt;br /&gt;
 zZzZzZ&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; from path import path   # BibliothÃ¨que [https://sixthdev.versionhost.com/viewcvs.cgi/handy/path.py path d'Orendorf]&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; usr = path(&amp;quot;/usr&amp;quot;)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print usr/&amp;quot;bin&amp;quot;         # Surcharge de l'opÃ©rateur a/b&lt;br /&gt;
 /usr/bin&lt;br /&gt;
&lt;br /&gt;
== Comparatif avec d'autres langages ==&lt;br /&gt;
&lt;br /&gt;
=== Comparatif avec le C++ ===&lt;br /&gt;
&lt;br /&gt;
* Le C++ possÃ¨de Ã©galement les vecteurs, listes, tables de hachage, itÃ©rateurs, l'opÃ©rateur Â« pour chaque Â» (bien que lourd Ã  utiliser), etc.&lt;br /&gt;
* La gestion des exceptions existe, mais il manque finally (que Borland a ajoutÃ© sans son compilateur) et on ne peut pas rÃ©cupÃ©rer la pile d'appel.&lt;br /&gt;
* Il manque les ''properties'' (Borland les a ajoutÃ© Ã  son compilateur)&lt;br /&gt;
* La gestion des paquetages est trÃ¨s lourde : il faut dupliquer les commentaires et prototypes dans les fichiers d'entÃªtes, extension &amp;quot;.h&amp;quot;. Par contre, il existe les espaces de nom (''namespace'').&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;font-size: 80%&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! C++ !! Python&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 class Personne {&lt;br /&gt;
     std::string prenom, nom;&lt;br /&gt;
 public:&lt;br /&gt;
     Personne(const std::string &amp;amp;prenom, const std::string &amp;amp;nom) {&lt;br /&gt;
         this-&amp;gt;prenom = prenom;&lt;br /&gt;
         this-&amp;gt;nom = nom;&lt;br /&gt;
     }&lt;br /&gt;
     friend std::ostream&amp;amp; operator&amp;lt;&amp;lt; (std::ostream&amp;amp;, const Personne&amp;amp;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 std::ostream&amp;amp; operator&amp;lt;&amp;lt; (std::ostream &amp;amp;os, const Personne &amp;amp;p) {&lt;br /&gt;
     os &amp;lt;&amp;lt; p.prenom &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; p.nom;&lt;br /&gt;
     return os;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void test() {&lt;br /&gt;
     std::vector&amp;lt;Personne&amp;gt; liste;&lt;br /&gt;
     liste.push_back(Personne(&amp;quot;Victor&amp;quot;, &amp;quot;Stinner&amp;quot;));&lt;br /&gt;
     liste.push_back(Personne(&amp;quot;Damien&amp;quot;, &amp;quot;Boucard&amp;quot;));&lt;br /&gt;
     for (std::vector&amp;lt;Personne&amp;gt;::iterator it=liste.begin(); it != liste.end(); ++it) {&lt;br /&gt;
         std::cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
||&lt;br /&gt;
 class Personne:&lt;br /&gt;
     def __init__(self, prenom, nom):&lt;br /&gt;
        self.prenom = prenom&lt;br /&gt;
        self.nom = nom&lt;br /&gt;
 &lt;br /&gt;
     def __str__(self):&lt;br /&gt;
        return &amp;quot;%s %s&amp;quot; % (self.prenom, sel.nom)&lt;br /&gt;
 &lt;br /&gt;
 def test():&lt;br /&gt;
     liste = [Personne(&amp;quot;Victor&amp;quot;, &amp;quot;Stinner&amp;quot;), Personne(&amp;quot;Damien&amp;quot;, &amp;quot;Boucard&amp;quot;)]&lt;br /&gt;
     for personne in liste:&lt;br /&gt;
        print personne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparatif avec le Java ===&lt;br /&gt;
&lt;br /&gt;
* Java possÃ¨de Ã©galement les vecteurs, listes, tables de hachage et itÃ©rateurs. Par contre avant Java 1.5, l'opÃ©rateur Â« pour chaque Â» manquait et les ''cast'' alourdissaient le code.&lt;br /&gt;
* La gestion des exceptions est trÃ¨s bonne, finally existe Ã©galement et on peut rÃ©cupÃ©rer la pile d'appel. Par contre, il faut explicitement attraper les exceptions pouvant Ãªtre levÃ©es et les renvoyer si on ne peut pas les traiter tout de suite. C'est un choix de Sun.&lt;br /&gt;
* La gestion des paquetages est trÃ¨s propre en Java, mais par contre une seule classe par fichier est autorisÃ©e (correctif: une seule classe '''publique''' par fichier)&lt;br /&gt;
* Java supporte Ã©galement les ''decorators'' (Python 2.4 s'en est largement inspirÃ©)&lt;br /&gt;
* Il manque les ''properties'', mais ceci est un choix de Sun&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;font-size: 80%&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Java !! Python&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
 import java.util.Vector;&lt;br /&gt;
 import java.util.Iterator;&lt;br /&gt;
 &lt;br /&gt;
 class Personne {&lt;br /&gt;
     String prenom, nom;&lt;br /&gt;
 &lt;br /&gt;
     public Personne(String nom, String prenom) {&lt;br /&gt;
         this.nom = nom;&lt;br /&gt;
         this.prenom = prenom;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public String toString() {&lt;br /&gt;
         return this.prenom+&amp;quot; &amp;quot;+this.nom;&lt;br /&gt;
     }&lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 void test() {&lt;br /&gt;
     Vector liste = new Vector();&lt;br /&gt;
     liste.addElement( new Personne(&amp;quot;Victor&amp;quot;, &amp;quot;Stinner&amp;quot;) ); &lt;br /&gt;
     liste.addElement( new Personne(&amp;quot;Damien&amp;quot;, &amp;quot;Boucard&amp;quot;) ); &lt;br /&gt;
     for (Iterator it = liste.iterator(); it.hasNext(); ) {&lt;br /&gt;
         System.out.println( it.next() );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
||&lt;br /&gt;
 class Personne:&lt;br /&gt;
     def __init__(self, prenom, nom):&lt;br /&gt;
         self.prenom = prenom&lt;br /&gt;
         self.nom = nom&lt;br /&gt;
 &lt;br /&gt;
     def __str__(self):&lt;br /&gt;
         return &amp;quot;%s %s&amp;quot; % (self.prenom, sel.nom)&lt;br /&gt;
 &lt;br /&gt;
 def test():&lt;br /&gt;
     liste = [Personne(&amp;quot;Victor&amp;quot;, &amp;quot;Stinner&amp;quot;), Personne(&amp;quot;Damien&amp;quot;, &amp;quot;Boucard&amp;quot;)]&lt;br /&gt;
     for personne in liste:&lt;br /&gt;
         print personne&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Programmation orientÃ©e objet ==&lt;br /&gt;
&lt;br /&gt;
Python supporte l'hÃ©ritage multiple, la visibilitÃ© (public, privÃ©, protÃ©gÃ©) et les propriÃ©tÃ©s (''property''). Ces derniÃ¨res sont vraiment trÃ¨s pratiques, et je ne comprend pas pourquoi cela n'a pas Ã©tÃ© ajoutÃ© au C++. Pour Java, Sun a choisi l'explicite en interdisant par exemple la surcharge des opÃ©rateurs. C'est un choix, mais je trouve Ã§a bien dommage.&lt;br /&gt;
&lt;br /&gt;
Les propriÃ©tÃ©s sont une invention gÃ©niale permettant d'ajouter des traitements lors de l'accÃ¨s en lecture sur un Â« attribut Â» d'un objet et sur la modification d'un Â« attribut Â» d'un objet. Je met attribut entre guillemets car on peut avoir des attributs fictifs ou calculÃ©s. De plus, on peut interdire la modification ou la lecture.&lt;br /&gt;
&lt;br /&gt;
Exemple sans propriÃ©tÃ© avec attributs publics :&lt;br /&gt;
 class Animal:&lt;br /&gt;
     def __init__(self, nom, age):&lt;br /&gt;
         self.nom = nom&lt;br /&gt;
         self.age = age&lt;br /&gt;
 &lt;br /&gt;
     def __str__(self):&lt;br /&gt;
         return &amp;quot;%s (%s ans)&amp;quot; % (self.nom, self.age)&lt;br /&gt;
 &lt;br /&gt;
 maurice = Animal(&amp;quot;Poisson&amp;quot;, 2)&lt;br /&gt;
 print maurice&lt;br /&gt;
 maurice.age = &amp;quot;ooops&amp;quot;&lt;br /&gt;
 print maurice&lt;br /&gt;
RÃ©sultat :&lt;br /&gt;
 Poisson (2 ans)&lt;br /&gt;
 Poisson (ooops ans)&lt;br /&gt;
Le problÃ¨me est qu'on peut entrer n'importe quelle valeur pour l'Ã¢ge, pas forcÃ©ment un nombre entier positif. On va donc ajouter des tests :&lt;br /&gt;
 class Animal('''object'''):&lt;br /&gt;
     def __init__(self, nom, age):&lt;br /&gt;
         self.nom = nom&lt;br /&gt;
         self.'''_age''' = age&lt;br /&gt;
 &lt;br /&gt;
     def _getAge(self):&lt;br /&gt;
         return self._age&lt;br /&gt;
     def _setAge(self, age):&lt;br /&gt;
         assert isinstance(age, int)&lt;br /&gt;
         assert 1 &amp;lt;= age &amp;lt;= 200&lt;br /&gt;
         self._age = age&lt;br /&gt;
     age = '''property'''(_getAge, _setAge)&lt;br /&gt;
 &lt;br /&gt;
     def __str__(self):&lt;br /&gt;
         return &amp;quot;%s (%s ans)&amp;quot; % (self.nom, self.age)&lt;br /&gt;
 &lt;br /&gt;
 maurice = Animal(&amp;quot;Poisson&amp;quot;, 1)&lt;br /&gt;
 maurice.age = &amp;quot;ooops&amp;quot;  &amp;lt;nowiki&amp;gt;~~~&amp;gt;&amp;lt;/nowiki&amp;gt; BOUM, une exception est levÃ©e&lt;br /&gt;
 maurice.age = -7       &amp;lt;nowiki&amp;gt;~~~&amp;gt;&amp;lt;/nowiki&amp;gt; BOUM, une exception est levÃ©e&lt;br /&gt;
L'attribut age est passÃ© en protÃ©gÃ© (accessible aux fils mais pas en dehors de l'objet) simplement en ajoutant &amp;quot;_&amp;quot;. Si l'on avait voulu le passer en privÃ©, il aurait fallu ajouter utiliser le nom &amp;quot;__age&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le gros avantage de propriÃ©tÃ©s et qu'on garde la mÃªme API publique, par contre le dÃ©savantage est qu'on est obligÃ© d'Ã©crire un ''getter'' '''et''' un ''setter''.&lt;br /&gt;
&lt;br /&gt;
== Ã€ complÃ©ter ==&lt;br /&gt;
&lt;br /&gt;
* Gestion des erreurs&lt;br /&gt;
* Documentation&lt;br /&gt;
* Paquetage&lt;br /&gt;
* HÃ©ritage d'une ou plusieurs classes&lt;br /&gt;
* Property, private &amp;amp;amp; protected&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
&lt;br /&gt;
* [[Python]] â€” [[pypy]]&lt;/div&gt;</description>
			<pubDate>Sat, 12 Aug 2006 01:44:11 GMT</pubDate>			<dc:creator>Haypo</dc:creator>			<comments>http://haypo.alwaysdata.net:443/wiki/Discuter:Python_ou_rien</comments>		</item>
	</channel>
</rss>