Polymorphisme
Difficile
Dans la programmation orientée objet (POO),le polymorphisme permet de:
Donner différent sens ou usage à quelque chose en fonction du contexte. |
Par exemple, permettre à une variable, à une fonction ou bien à un objet d'avoir plus d'une forme.
Le polymorphisme se manifeste sous 2 formes:
Le polymorphisme se manifeste sous 2 formes:
- Overloading (Méthodes & opérateurs)
- Overriding (Méthodes)
Overloading (Méthodes & opérateurs)
Method Overloading
Methods overloading signifie:
Avoir 2 méthodes (ou plus) portant le même nom dans la même classe mais avec des paramètres différents . |
Prenons l'exemple suivant:
def product(a, b):
return a * b
def product(a, b, c):
return a * b * c
product(2, 3)
>>>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-878f6a0432c5> in <module>()
----> 1 product(2, 3)
TypeError: product() missing 1 required positional argument: 'c'
product(2, 3, 4)
>>> 24
Seule la dernière fonction est prise en compte. Cela signifie qu'on ne peut qu'avoir qu'une seule fonction avec le même nom.
Ainsi Python supporte-t-il vraiment l'overloading method ?
En fait, Python le supporte mais nous devons trouver une autre manière de l'exprimer.
Ainsi Python supporte-t-il vraiment l'overloading method ?
En fait, Python le supporte mais nous devons trouver une autre manière de l'exprimer.
Remarque:
En Java, le code au-dessus aurait marché correctement. |
Un moyen d'y parvenir est d'utiliser *arg.
def f(x, *argv):
print("content of the variable x: ", x)
for i in range(0, len(argv)):
print("elt {} in *argv : {} ".format(i, argv[i]))
i += 1
f('hello', 'a', 'b', 'c')
>>>
content of the variable x: hello
elt 0 in *argv : a
elt 1 in *argv : b
elt 2 in *argv : c
f('1', '2')
>>>
content of the variable x: 1
elt 0 in *argv : 2
Ainsi, *argv nous permet d'avoir autant de paramètres que l'on veut. Ces derniers sont stockés dans une liste (*argv).
Revenons à notre exemple précédent avec product().
def product(*args):
answer = 1
for elt in args:
answer = answer * elt
return answer
print(product(2, 3))
>>> 6
print(product(2, 3, 4))
>>> 24
Operator overloading
Operator overloading signifie:
Ajouter de nouvelles fonctionnalités aux opérateurs pour qu'ils puissent être utilisé d'une autre manière. |
Par exemple, l'opérateur + permet de faire une addition. Mais si on utilise l'overload, il peut être utilisé pour concatener des strings.
Voir exemple 4 dans le cours Méthodes spéciales - Magic/Dunder méthodes.
Overriding
Method overriding
Method overriding signifie:
Utiliser une méthode de la classe mère de manière différente dans la classe fille. |
class Parent(object):
def __init__(self):
self.value = 5
def get_value(self):
return self.value
class Child(Parent):
def get_value(self):
return 42
p = Parent()
print(p.get_value())
>>> 5
c = Child()
print(c.get_value())
>>> 42
Pour résumer:
Le polymorphisme permet de donner différent sens ou usage à quelque chose en fonction du contexte.
Ce dernier se manifeste sous 2 formes: 1. Overloading (Méthodes & opérateurs) 2. Overriding (Méthodes) |