Questions basiques sur la classe et la méthode statique en POO

a marqué ce sujet comme résolu.

Bonjour,

Je suis un petit nouveau. J’apprends à utiliser les classes en tant que notion usitée en POO sous PYTHON. Voici 2 programmes, dont l’un est commenté :

##class Calcul:
##    @staticmethod
##    def somme(x=1,y=1):
##        s=x+y
##        return s
##
##print(Calcul.somme())

def somme(x=1,y=1):
    s=x+y
    return s

print(somme())

Le résultat est identique. Quelle différence y a-t-il entre une méthode statique et une simple fonction ? selon moi rien.

Quel intérêt y a-t-il à utiliser la notion de classe relative à la POO dans un tel cas de figure si l’on n’instancie pas d’objets avec ses caractéristiques habituelles : état (variables ou données) et comportement (méthodes) ? Autant passer par une simple fonction .

Dans quel cas de figure l’une est plus pertinente que l’autre ?

Merci à vous.

+0 -0

Quelle différence y a-t-il entre une méthode statique et une simple fonction ? selon moi rien.

Quel intérêt y a-t-il à utiliser la notion de classe relative à la POO dans un tel cas de figure si l’on n’instancie pas d’objets avec ses caractéristiques habituelles : état (variables ou données) et comportement (méthodes) ? Autant passer par une simple fonction .

Dans quel cas de figure l’une est plus pertinente que l’autre ?

TITI31

Il n’y a pas fondamentalement de différence. Calcul.somme est d’ailleurs une fonction.

Là où les fonctions statiques c’est quand la classe qui la contient ne se résume pas à ça et que la fonction statique est juste une fonction utilisée par d’autres méthodes de la classe et qui n’a pas besoin d’interagir avec d’autres éléments de la classe.

Si ta classe Calcul se résume à cette fonction somme alors il est préférable de la supprimer et de la remplacer par un module.

Comme dis @Melcore, c’est surtout une gestion des espaces de noms.

Supposons que tu as dans ton module deux classes proches mais qui nécessites deux implémentations séparées d’une fonction. Disons, Matrice et Vecteur et la fonction zeros qui retourne un objet du type mais remplis de 0.

En les mettant statiques tu peux ainsi faire Matrice::zeros et Vecteur::zeros plutôt que dans l’espace de nom du module et pour ne pas confondre on serait obligé de les renommés zerosMatrice et zerosVecteur.

Il n’y a pas de raison qu’il y ait un gain de performance par-contre.

+3 -1

Comme dis @Melcore, c’est surtout une gestion des espaces de noms.

Supposons que tu as dans ton module deux classes proches mais qui nécessites deux implémentations séparées d’une fonction. Disons, Matrice et Vecteur et la fonction zeros qui retourne un objet du type mais remplis de 0.

En les mettant statiques tu peux ainsi faire Matrice::zeros et Vecteur::zeros plutôt que dans l’espace de nom du module et pour ne pas confondre on serait obligé de les renommés zerosMatrice et zerosVecteur.

ache

Tu ne vas pas utiliser des méthode statiques pour cela mais des méthodes de classes (@classmethod) qui reçoivent la classe courante en argument et ont donc un fonctionnement différent des méthodes statiques puisqu’elles peuvent interagir avec la classe.

Les méthodes statiques sont vraiment des fonctions isolées rangées dans des classes, par commodité.

Les méthodes statiques sont vraiment des fonctions isolées rangées dans des classes, par commodité.

entwanne

Un exemple bidon, une classe Voiture, que je peux instancier pour représenter une voiture précise. Admettons que j’ai une fonction qui aille chercher, sur Internet par exemple, la liste de tous les modèles de voiture existantes pour me les proposer et me faciliter le boulot. Elle n’a en soit pas besoin d’interagir avec les instances de la classe, ni avec la classe elle-même. Mais ça fait sens de la ranger dans la classe malgré tout.

class Voiture:
    def __init__(self, marque, modele, nb_porte, nb_siege):
        ...
    
    @staticmethod
    def liste_marques():
        # On récupère une liste de marques quelque part, on l'affiche
        ...

Ce qui nous autorise à faire ça :

>> Voiture.liste_marques()
Les marques disponibles sont : Renault, Mercedes, Peugeot, Fiat
>> ma_voiture = Voiture('Renault', 'Clio', 12, 2)

Bonjour,

Je prends en considération tout ce que vous me dites. Vous m’avez tous aidés. Peut-on affirmer que le recours à une méthode statique est plus sûre, plus fiable qu’une simple fonction def ? Bien sûr tout dépend du contexte, de la problématique qui se pose à nous. N’hésitez à revenir vers moi si vous disposez d’autres informations.

Titi31.

+0 -0

Alors c’est vrai que dans le cas particulier de Python, il y a le décorateur classmethod spécifiquement dédié à la création de constructeurs alternatifs, donc mon exemple est pas forcément Pythonique.

Il est plus général dans le sens que dans les autres langages, on n’a pas de distinction en méthode de classe et méthode statique.

@TITI31:

Peut-on affirmer que le recours à une méthode statique est plus sûre, plus fiable qu’une simple fonction def ?

Je pense pas qu’on puisse dire ça. C’est juste une histoire de classer les fonctions. Le terme sûr impliquerait qu’on a une assurance quelconque sur le comportement de la fonction or ce n’est pas le cas ici. Certains termes en informatique ont des sens spécifiques, tu ne peux pas trop les utilisés dans d’autres contextes.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte