2 votes

Appeler une méthode statique en utilisant le nom de la classe - Bon ou Mauvais ?

Je deviens de plus en plus familier avec les méthodes statiques et les méthodes de classe et je connais la différence entre chacune. Mais je suis tombé sur un problème aujourd'hui où j'aimerais un peu référencer à la fois self et cls dans une méthode.

La seule façon que je connaisse pour accomplir cela est de faire une méthode de classe normale (non avec @classmethod, mais simplement avec def) et d'appeler la classe avec son nom explicitement comme ceci :

class myClass:
    def __init__():
        self._ser.connect('COM5')

    def ask(self, message: str) -> str:
        return myClass.clean_output(self._ser.query(message))

    @staticmethod
    def clean_output(dirty_string: str):
        clean_string = dirty_string.strip().replace(chr(4))
        return clean_string

Cet exemple est une version simplifiée de la philosophie. J'aimerais appeler une fonction de nettoyage ou d'analyse sur les données que je reçois, par exemple d'un appareil série. Y a-t-il un moyen de mettre en œuvre la méthode ask comme ceci ? :

    def ask(self, message: str) -> str:
        return cls.clean_output(self._ser.query(message))

Ou est-ce correct que je l'appelle avec myClass explicitement comme ça ? Si c'est le cas, quand les programmeurs devraient-ils utiliser @classmethod et quand est-il permis d'utiliser le nom de la classe lui-même ? Est-ce que l'utilisation du décorateur @classmethod est vraiment nécessaire lorsque vous vous attendez à ce que l'héritage se produise ?

3voto

Martijn Pieters Points 271458

Il suffit d'appeler la méthode statique sur self:

def ask(self, message: str) -> str:
    return self.clean_output(self._ser.query(message))

Il est également disponible.

Les attributs d'une classe sont toujours disponibles sur les instances aussi (s'il n'y a pas d'attribut sur l'instance même portant le même nom le masquant). Les méthodes (qu'elles soient régulières, statiques ou de classe) ne font pas exception, ce sont aussi des attributs. Leur comportement de liaison n'a pas d'importance ici.

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