2 votes

Multiméthodes Python utilisant isinstance

Sur cet article Guido van Rossum affirme que ce type d'implémentation multiméthodes en Python :

def foo(a, b):
    if isinstance(a, int) and isinstance(b, int):
        ...code for two ints...
    elif isinstance(a, float) and isinstance(b, float):
        ...code for two floats...
    elif isinstance(a, str) and isinstance(b, str):
        ...code for two strings...
    else:
        raise TypeError("unsupported argument types (%s, %s)" % (type(a), type(b)))

est "fastidieux" et "pas très OO". Il se lance ensuite dans une description de la manière dont les décorateurs peuvent être utilisés pour mettre en œuvre des multiméthodes, ce qui, à mon avis, est inaccessible à ceux qui n'ont pas une connaissance assez approfondie de Python.

Ma question : J'ai besoin d'écrire une multiméthode, qu'est-ce qui n'est "pas OO" dans le code ci-dessus ?

UPDATE : À la lumière de la réponse de Thomas Orozco, je réalise maintenant que je n'ai pas du tout "besoin" d'écrire une multiméthode.

4voto

Thomas Orozco Points 15280

Plutôt que d'inspecter les types des objets transmis à votre méthode, vous feriez en sorte que les objets mettent eux-mêmes en œuvre la logique.

Prenons un exemple : le len fonction.

Une implémentation native serait :

def len(x):
    if type(x) == str:
        # compute the length of a string
    elif type(x) == list:
        # compute the length of a list
    else:
        #

Mais il y a quelques réserves à faire

  • Vous ne pouviez pas soutenir len dans vos propres objets sans réimplémenter len
  • C'est un énorme, illisible, désordre

Et, le plus important, la partie OO de cela, cela signifie que votre implémentation de str est éparpillée dans votre base de code : le code pour calculer sa longueur est ici, le code pour la découper est ailleurs...


Au lieu de cela, une conception beaucoup plus saine est utilisée dans Python :

def len(x):
    return x.__len__()

C'est ensuite à chaque objet de mettre en œuvre le __len__ la méthode elle-même. Le site len demande simplement la longueur de l'objet.

Dans une certaine mesure, vous pouvez considérer cela comme un "Modèle de stratégie"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X