From d3773284cb2d4be663b8bbe957e8e54fe0656076 Mon Sep 17 00:00:00 2001 From: "marc.friedli" Date: Thu, 30 Mar 2017 12:44:05 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Correctif=20n=C2=B01=20:=20ajout=20du=20lie?= =?UTF-8?q?n=20vers=20la=20documentation=20officielle=20de=20python;=20sup?= =?UTF-8?q?pression=20du=20paragraphe=20sur=20les=20m=C3=A9thodes=20priv?= =?UTF-8?q?=C3=A9es=20car=20erron=C3=A9;=20correction=20des=20docString=20?= =?UTF-8?q?des=20fichiers=20pythons=20pour=20qu'ils=20reflettent=20plus=20?= =?UTF-8?q?ce=20qu'ils=20repr=C3=A9sentent=20et=20non=20mon=20appr=C3=A9he?= =?UTF-8?q?ntion=20de=20travis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/dunders/index.rst | 17 +++++------------ source/dunders/main.py | 4 ++-- source/dunders/someclass.py | 2 +- source/dunders/vector.py | 2 +- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/source/dunders/index.rst b/source/dunders/index.rst index f91daa91..f60b5f4e 100644 --- a/source/dunders/index.rst +++ b/source/dunders/index.rst @@ -66,18 +66,6 @@ Voir: `Python and the Principle of Least Astonishment Date: Thu, 20 Apr 2017 13:27:09 +0200 Subject: [PATCH 2/4] =?UTF-8?q?modification=20d'une=20partie=20du=20texte?= =?UTF-8?q?=20d'introduction=20:=20suppression=20de=20la=20partie=20concer?= =?UTF-8?q?nant=20java=20car=20j'=C3=A9tais=20parti=20sur=20une=20mauvaise?= =?UTF-8?q?=20base.=20Remplacement=20par=20un=20texte=20indiquant=20que=20?= =?UTF-8?q?les=20dunders=20sont=20priv=C3=A9s.=20Modification=20de=20la=20?= =?UTF-8?q?fonction=20ajouter=20de=20la=20classe=20Main=20pour=20utiliser?= =?UTF-8?q?=20un=20dunder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/dunders/index.rst | 17 ++++++----------- source/dunders/main.py | 6 +++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/source/dunders/index.rst b/source/dunders/index.rst index f60b5f4e..b44e15ee 100644 --- a/source/dunders/index.rst +++ b/source/dunders/index.rst @@ -11,24 +11,19 @@ Introduction Le mot dunder est un raccourci de *Double UNDERscore* et représente toutes les méthodes Python qui commencent et finissent par un double underscore (par ex. ``__init__()``). -Les dunders sont des méthodes très puissantes et régulièrement utilisées en python. Ce sont des méthodes universelles que toute classe possède (un peu à l'image de la class Object dans Java). +Les dunders sont des méthodes très puissantes et régulièrement utilisées en python. Un dunder est toujours une méthode privée appartenant à une classe. La particularité de ces méthodes et qu'elles ne sont jamais directement appelées mais toujours implicitement ou explicitement -.. Quel lien entre Object de Java et les dunders? - -Cependant, dans python, les dunders sont rarement appelés directement. - -.. todo:: Un peu imprécis car il n'y a pas que des méthodes. ``__name__`` ou ``__file__`` - -Par exemple : +par exemple : .. code-block:: python3 - toto = new MyClass() + x = MyClass() #fera appel au dunder __init__() de la classe MyClass + str(x) #fera appel au dunder __str__() de la classe MyClass + str(12) #fera appel au dunder __str__() de la classe Integer -fera appel aux méthodes ``__new__()`` et ``__init__()`` même si ces méthodes n'ont pas été surchargées. +.. todo:: Un peu imprécis car il n'y a pas que des méthodes. ``__name__`` ou ``__file__`` -.. c'est un peu la base de la programmation orienté objet... Les dunders ont des méthodes raccourci qui vont directement les appeler (autre raison pour laquelle on utilise régulièrement les dunders sans s'en rendre compte) : diff --git a/source/dunders/main.py b/source/dunders/main.py index 9a0785d5..564fb43d 100644 --- a/source/dunders/main.py +++ b/source/dunders/main.py @@ -8,8 +8,8 @@ def __init__(self, *args): """Initialisateur.""" self.cartes = args - def ajouter(self, carte): - """Méthode pour add une carte.""" + def __add__(self, carte): + """Redéfinition de l'opérateur + pour add une carte.""" obj2 = list(self.cartes) # Converti en liste obj2.append(carte) self.cartes = tuple(obj2) @@ -42,7 +42,7 @@ def __contains__(self, item): main = Main('1Coeur', '7Pique') print(str(main)) -main.ajouter('AsCoeur') +main+'AsCoeur' # parce qu'on a défini __iter__! for carte in main: From f8f79f20fd00a616360a185aba9d2f72824fe4ec Mon Sep 17 00:00:00 2001 From: "marc.friedli" Date: Wed, 14 Jun 2017 18:06:43 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Modification=20du=20texte,=20suppression=20?= =?UTF-8?q?de=20parties=20ineptes,=20ajout=20d'une=20partie=20sur=20=5F=5F?= =?UTF-8?q?name=5F=5F.=20Ajout=20d'un=20fichier=20pour=20compl=C3=A9ter=20?= =?UTF-8?q?=5F=5Fname=5F=5F.=20Ajout=20d'une=20partie=20sur=20les=20attrib?= =?UTF-8?q?uts=20priv=C3=A9s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/dunders/index.rst | 42 +++++++++++++++++------------------ source/dunders/name_dunder.py | 14 ++++++++++++ 2 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 source/dunders/name_dunder.py diff --git a/source/dunders/index.rst b/source/dunders/index.rst index b44e15ee..2a3f80e7 100644 --- a/source/dunders/index.rst +++ b/source/dunders/index.rst @@ -11,7 +11,7 @@ Introduction Le mot dunder est un raccourci de *Double UNDERscore* et représente toutes les méthodes Python qui commencent et finissent par un double underscore (par ex. ``__init__()``). -Les dunders sont des méthodes très puissantes et régulièrement utilisées en python. Un dunder est toujours une méthode privée appartenant à une classe. La particularité de ces méthodes et qu'elles ne sont jamais directement appelées mais toujours implicitement ou explicitement +Les dunders sont des méthodes universelles de python. Chacun des dunders est lié à une méthode qui sera implicitement appelée lorsqu'on fait appel au dunder (ce qui fait qu'elles sont également appelés méthodes magiques). De ce fait, on utilise fréquemment des dunders sans s'en rendre compte. par exemple : @@ -20,33 +20,16 @@ par exemple : x = MyClass() #fera appel au dunder __init__() de la classe MyClass str(x) #fera appel au dunder __str__() de la classe MyClass str(12) #fera appel au dunder __str__() de la classe Integer + add = 4 + 5 # fera appel au dunder ``__add__()`` de la classe Number -.. todo:: Un peu imprécis car il n'y a pas que des méthodes. ``__name__`` ou ``__file__`` +Les dunders fonctionnent églaement d'autres éléments que des classes, par exemple le dunder *__name__* permet de connaitre le nom du module utilisé, pratique quand on veut exécuter certaines fonctions uniquement lors de l'exécution d'un module et pas lors de son import : -Les dunders ont des méthodes raccourci qui vont directement les appeler (autre raison pour laquelle on utilise régulièrement les dunders sans s'en rendre compte) : +.. literalinclude:: name_dunder.py -.. code-block:: pycon - >>> 4 + 5 - 9 - - -fera appel au dunder ``__add__()`` - -.. de quelle classe? puisque c'est une méthode. - -Ou bien : - -.. code-block:: python3 - - str("I'm a text") - - -fera appel au dunder ``__str__()`` de :py:class:`str`. - -.. obtenir la chaine de caractère d'une chaine de caractère, n'est pas le meilleur exemple. +Dans le même registre, un package nécessite d'avoir un fichier __init__.py qui s'exécute automatiquement lors de l'import dudit package. La grande puissance des dunders est leur universalité. En effet, Python a été programmé de manière à ce qu'une opération soit toujours relié au même *dunder*. @@ -89,6 +72,21 @@ De base, quand on chercher à afficher un objet, à moins que la méthode ``__st Idéalement, il faudrait toujours redéfinir la méthode ``__repr__()`` et redéfinir ``__str__()`` uniquement si on a besoin de l'ambiguïté. + +Membres privées +================ + +Bien que n'étant pas un dunder, un membre commençant pas un double underscore sera considéré comme étant un membre privé : + + +.. code-block:: python3 + + __private_attribut = 12 + + +Cependant, cette pratique est déconseillée en python car rien n'est vraiment privé et il sera toujours possible d'accéder à *__private_attribut*. Par convension, on utilise un seul undersecore pour signaler qu'un méthode est privée et après c'est à la responsabilité du développeur de ne pas faire n'importe quoi. "We are all adults here" + + Conclusion ========== diff --git a/source/dunders/name_dunder.py b/source/dunders/name_dunder.py new file mode 100644 index 00000000..a5275c92 --- /dev/null +++ b/source/dunders/name_dunder.py @@ -0,0 +1,14 @@ +"""Module d'exemple utilisant le dunder __name__.""" + + +def some_function(): + """Affiche une simple phrase.""" + print("I'm a script") + + +if __name__ == __main__: + """ + some_function ne s'exécute que si on lance directement le module + et pas si on l'importe. + """ + some_function() From 199ba0f20689bf68de2671ab284d510a62dce837 Mon Sep 17 00:00:00 2001 From: "marc.friedli" Date: Thu, 15 Jun 2017 12:46:17 +0200 Subject: [PATCH 4/4] Correctif : oubli de guillemets. --- source/dunders/name_dunder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dunders/name_dunder.py b/source/dunders/name_dunder.py index a5275c92..98aacbcf 100644 --- a/source/dunders/name_dunder.py +++ b/source/dunders/name_dunder.py @@ -6,7 +6,7 @@ def some_function(): print("I'm a script") -if __name__ == __main__: +if __name__ == '__main__': """ some_function ne s'exécute que si on lance directement le module et pas si on l'importe.