Remplacer une classe avec une seule méthode par une fonction en Python

Vous avez une classe qui ne définit qu’une seule méthode en plus de __init__(). Cependant, pour simplifier votre code, vous préférez de loin avoir une fonction simple.

Dans de nombreux cas, les classes à méthode unique peuvent être transformées en fonctions à l’aide de fermetures. Considérons, par exemple, la classe suivante, qui permet à un utilisateur de récupérer des URLs à l’aide d’une sorte de modèle.

from urllib.request import urlopen

class UrlTemplate:
    def __init__(self, template):
        self.template = template
    def open(self, **kwargs):
        return urlopen(self.template.format_map(kwargs))

# Exemple d'utilisation. Télécharger les données boursières de yahoo
yahoo = UrlTemplate('http://finance.yahoo.com/d/quotes.csv?s={names}&f={fields}')
for line in yahoo.open(names='IBM,AAPL,FB', fields='sl1c1v'):
    print(line.decode('utf-8'))

La classe pourrait être remplacée par une fonction beaucoup plus simple:

def urltemplate(template):
    def opener(**kwargs):
        return urlopen(template.format_map(kwargs))
    return opener

# Exemple
yahoo = urltemplate('http://finance.yahoo.com/d/quotes.csv?s={names}&f={fields}')
for line in yahoo(names='IBM,AAPL,FB', fields='sl1c1v'):
    print(line.decode('utf-8'))

Dans de nombreux cas, la seule raison pour laquelle vous pouvez avoir une classe à méthode unique est de stocker des états supplémentaires à utiliser dans la méthode.

Par exemple, le seul but de la classe UrlTemplate est de maintenir la valeur du template quelque part pour qu’elle puisse être utilisée dans la méthode open().

L’utilisation d’une fonction intérieure ou d’une fermeture, comme le montre la solution, est souvent plus élégante. En termes simples, une fermeture n’est qu’une fonction, mais avec un environnement supplémentaire de variables qui sont utilisées à l’intérieur de la fonction.

L’une des principales caractéristiques d’une fermeture est qu’elle se souvient de l’environnement dans lequel elle a été définie. Ainsi, dans la solution, la fonction opener() mémorise la valeur de l’argument template, et l’utilise dans les appels suivants.

Chaque fois que vous écrivez du code et que vous rencontrez le problème d’attacher un état supplémentaire à une fonction, pensez aux fermetures. Ils sont souvent une solution plus minimale et élégante que l’alternative qui consiste à transformer votre fonction en une classe à part entière.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here