ajout des design patterns
This commit is contained in:
parent
9d1597fc15
commit
f52d023781
|
@ -0,0 +1,94 @@
|
||||||
|
Les design patterns
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Les design patterns **ne sont pas** indépendants du langage.
|
||||||
|
Ils dépendent de l'implémentation.
|
||||||
|
|
||||||
|
Le duck typing
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
En python, le duck typing est une forme extreme de programmation par interface.
|
||||||
|
Ne pas hériter dans des directions fausse
|
||||||
|
|
||||||
|
exemple : une voiture ne peut hériter d'un moteur, parce que un moteur n'est pas une voiture.
|
||||||
|
|
||||||
|
hold or wrap ?
|
||||||
|
--------------
|
||||||
|
|
||||||
|
**hold**::
|
||||||
|
|
||||||
|
O.S.method()
|
||||||
|
|
||||||
|
Cela induit un couplage fort (cf la loi de Demeter)
|
||||||
|
|
||||||
|
.. important:: law of Demeter : never more than one dot.
|
||||||
|
|
||||||
|
wrap : a hold by private name, with a::
|
||||||
|
|
||||||
|
self.S.method()
|
||||||
|
|
||||||
|
Ou bien une méthode getattr::
|
||||||
|
|
||||||
|
__getattr__()
|
||||||
|
|
||||||
|
Gets coupling right.
|
||||||
|
|
||||||
|
|
||||||
|
wrapper can restrict, inheritance cannot restrict
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class RestrictingWrapper(object):
|
||||||
|
|
||||||
|
def __init__(self, w, block):
|
||||||
|
self._w = w
|
||||||
|
self._block = block
|
||||||
|
|
||||||
|
def __getattr__(self, n):
|
||||||
|
if n in self._block:
|
||||||
|
raise AttributeError, n
|
||||||
|
return getattr(self._w, n)
|
||||||
|
|
||||||
|
Pattern de création : singleton
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
# utiliser un module au lieu d'une classe
|
||||||
|
|
||||||
|
in `toto.py`::
|
||||||
|
|
||||||
|
class Toto()
|
||||||
|
toto = Toto()
|
||||||
|
|
||||||
|
in another module::
|
||||||
|
|
||||||
|
from toto import toto
|
||||||
|
|
||||||
|
la factory
|
||||||
|
--------------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
def load(pkg, obj):
|
||||||
|
m = __import__(pkg, {}, {}, [obj])
|
||||||
|
return getattr(m, obj)
|
||||||
|
|
||||||
|
cls = load('p1.p2.p3', 'c4')
|
||||||
|
|
||||||
|
|
||||||
|
template method (self delegation)
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
# Abstract base class::
|
||||||
|
|
||||||
|
def OrganiseMethod()
|
||||||
|
def org_method():
|
||||||
|
def do_this()
|
||||||
|
def do_that()
|
||||||
|
|
||||||
|
def Concrete(OrganiseMethod)
|
||||||
|
def do_this(): ...
|
||||||
|
def do_that(): ...
|
||||||
|
|
||||||
|
il est préférable de lever une NotImplementedError, ce qui revient à faire
|
||||||
|
une classe abstraite.
|
|
@ -5,3 +5,16 @@ Voici la liste des liens vers les différents exercices de la formation.
|
||||||
|
|
||||||
|
|
||||||
.. todolist::
|
.. todolist::
|
||||||
|
|
||||||
|
|
||||||
|
exercices à faire
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
- implémenter un script qui lit les arguments de la ligne de commande et qui les écrit sur la sortie standard
|
||||||
|
- implémenter les sous-classes de shape point et cercle, calculer le périmètre.
|
||||||
|
- itérer sur une liste et récupérer la valeur maximum de cette liste (la fonction builtin *max*)
|
||||||
|
|
||||||
|
|
||||||
|
>>> a = [3,8,3,5,9,1,4]
|
||||||
|
>>> max(a)
|
||||||
|
9
|
||||||
|
|
Loading…
Reference in New Issue