Se connecter

Informatique

Programmation

Sujet : POO python
1
MonsieurBeauf
Niveau 10
24 mars 2020 à 16:17:49

Salut,

question toute bête : j'ai jamais développé sérieusement en python et je voulais savoir si ça se faisait, dans une classe, d'avoir plusieurs méthodes ayant le même nom mais pas les même paramètres. La signature est donc différente, c'est très connu en java et je sais pas si c'est faisable en python de la même manière et surtout si c'est une bonne pratique "pythonnique"

thx les poulets :coeur:

[Black_Spirit]
Niveau 15
24 mars 2020 à 19:09:05

Nope, pas possible.

AlainTest1
Niveau 9
24 mars 2020 à 19:26:25

Salut !
Tu parles d'overload ?
Jamais essayé.

À noter que c'est arrivé tard en Java, d'où le fait que les programmeurs Java ont tendance à utiliser des getters et des setters et non pas des sortes de "attr_accessor" comme on peut en voir en Ruby.

Pour ce qui est de Python, j'ai trouvé un article qui en parle.
https://www.codementor.io/@arpitbhayani/overload-functions-in-python-13e32ahzqt

Je ne l'ai pas lu mais ça a l'air propre.
Apparemment il n'y a pas d'overload en Python.

À noter que tu peux toujours utiliser des "Décorateurs" en Python. Tout dépend ce que tu veux faire.

Ah et au fait, si jamais...
https://m.jeuxvideo.com/forums/42-51-62534259-1-0-1-0-qui-pour-discord.htm
Je suis peu présent sur le forum.

[Black_Spirit]
Niveau 15
24 mars 2020 à 19:36:49

Ça dépend surtout le besoin. Y a d'autres manières d'avoir un résultat équivalent. Personnellement j'ai jamais eu besoin de faire du method overloading en python, donc forcer la feature via des workaround ça me semble pas très "pythonique" justement.

AlainTest1
Niveau 9
24 mars 2020 à 19:43:11

Le 24 mars 2020 à 19:36:49 [Black_Spirit] a écrit :
Ça dépend surtout le besoin. Y a d'autres manières d'avoir un résultat équivalent. Personnellement j'ai jamais eu besoin de faire du method overloading en python, donc forcer la feature via des workaround ça me semble pas très "pythonique" justement.

La question étant de savoir si tu as déjà fait autre chose que du Python...

MonsieurBeauf
Niveau 10
24 mars 2020 à 19:53:20

Le 24 mars 2020 à 19:26:25 AlainTest1 a écrit :
Salut !
Tu parles d'overload ?
Jamais essayé.

À noter que c'est arrivé tard en Java, d'où le fait que les programmeurs Java ont tendance à utiliser des getters et des setters et non pas des sortes de "attr_accessor" comme on peut en voir en Ruby.

Pour ce qui est de Python, j'ai trouvé un article qui en parle.
https://www.codementor.io/@arpitbhayani/overload-functions-in-python-13e32ahzqt

Je ne l'ai pas lu mais ça a l'air propre.
Apparemment il n'y a pas d'overload en Python.

À noter que tu peux toujours utiliser des "Décorateurs" en Python. Tout dépend ce que tu veux faire.

Ah et au fait, si jamais...
https://m.jeuxvideo.com/forums/42-51-62534259-1-0-1-0-qui-pour-discord.htm
Je suis peu présent sur le forum.

yes ton article est exactement ce qu'il me fallait. J'ai jamais développé d'application de manière pro en python là je c'est nickel merci ! :)

[Black_Spirit]
Niveau 15
24 mars 2020 à 19:54:58

Oui justement. Et on choisit une techno en fonction de son besoin, pas l'inverse. Donc faire des workarounds pour simuler (en moins bien donc) ce que propose un autre langage, je suis pas fan.

Surtout qu'y a certainement d'autres manières plus simple de faire un truc équivalent. En utilisant *args et **kwargs ou encore via les paramètres par défaut par exemple.

MonsieurBeauf
Niveau 10
24 mars 2020 à 20:20:48

Le 24 mars 2020 à 19:54:58 [Black_Spirit] a écrit :
Oui justement. Et on choisit une techno en fonction de son besoin, pas l'inverse. Donc faire des workarounds pour simuler (en moins bien donc) ce que propose un autre langage, je suis pas fan.

Surtout qu'y a certainement d'autres manières plus simple de faire un truc équivalent. En utilisant *args et **kwargs ou encore via les paramètres par défaut par exemple.

Ouais j'ai commencé à développer mes classes avec les *args mais pour la doc c'est horrible, si je retouche au code dans 2 ans je saurai pas à quoi tout ce bordel sert héhé

[Black_Spirit]
Niveau 15
24 mars 2020 à 20:35:47

Sinon, en python, un fichier c'est un module et un module a son namespace.

Donc en gros tu peux aussi avoir différents fichiers et faire un truc de ce genre :

Fichier square.py :


def area(n):
    return n * n

Fichier rectangle.py :


def area(n, m):
    return n * m

Fichier main.py, le point d'entrée:


import square
import rectangle

print(square.area(2))  # 4
print(rectangle.area(2, 3))  # 6

Les classes aussi ont leur propre namespace donc une autre manière de faire ça serait d'avoir pleins de classes (Square, Rectangle, etc.) qui définissent chacune leur propre méthode area.

Ou encore un example avec des paramètres par défauts :


def area(length, width=None):
    if width is not None:
        return length * width

    return length * length


print(area(2))  # 4
print(area(2, 3))  # 6

Donc voilà, ça dépend pourquoi t'as besoin de le faire en fait.

MonsieurBeauf
Niveau 10
24 mars 2020 à 20:53:43

Le 24 mars 2020 à 20:35:47 [Black_Spirit] a écrit :
Sinon, en python, un fichier c'est un module et un module a son namespace.

Donc en gros tu peux aussi avoir différents fichiers et faire un truc de ce genre :

Fichier square.py :


def area(n):
    return n * n

Fichier rectangle.py :


def area(n, m):
    return n * m

Fichier main.py, le point d'entrée:


import square
import rectangle

print(square.area(2))  # 4
print(rectangle.area(2, 3))  # 6

Les classes aussi ont leur propre namespace donc une autre manière de faire ça serait d'avoir pleins de classes (Square, Rectangle, etc.) qui définissent chacune leur propre méthode area.

Ou encore un example avec des paramètres par défauts :


def area(length, width=None):
    if width is not None:
        return length * width

    return length * length


print(area(2))  # 4
print(area(2, 3))  # 6

Donc voilà, ça dépend pourquoi t'as besoin de le faire en fait.

Ouais je vois, j'ai déjà utilisé ce genre de chose par le passé. Grosso modo, j'ai une classe qui joue le rôle de gate pour communiquer avec une API. Elle émet et reçoit de la data, le but c'est de simplifier l'émission de requête en les sous-découpant. Le sous-découpage ne dépend exclusivement que des headers et des paramètres de mes requêtes.

Grosso modo, j'ai 4 types de requêtes qui nécessiterait 4 même méthodes dont les paramètres seraient différents quoi mais dans mon projet, ça n'aurait aucun sens que ces méthodes aient des noms différents. Et si je dois utiliser cette même classe plus tard, je dois pouvoir comprendre comment la méthode marche juste en lisant la signature, c'est pour ça que je préfère ne pas utiliser de *arg. Surtout qu'il y a des try except partout, si en plus je dois catch quand le *arg est mal rempli.. ahah

[Black_Spirit]
Niveau 15
24 mars 2020 à 20:55:07

Je peux pas edit mais une manière encore plus simple avec paramètres par défaut c'est ça.


def area(length, width=1):
    return length * width


print(area(2))  # 4
print(area(2, 3))  # 6

En gros si tu précises pas la valeur de width, ça sera 1 par défaut. Sinon ça sera celle passé en paramètre. Honnêtement juste avec ça, y a moyen de gérer pas mal de Use cases.

MonsieurBeauf
Niveau 10
24 mars 2020 à 20:59:21

Le 24 mars 2020 à 20:55:07 [Black_Spirit] a écrit :
Je peux pas edit mais une manière encore plus simple avec paramètres par défaut c'est ça.


def area(length, width=1):
    return length * width


print(area(2))  # 4
print(area(2, 3))  # 6

En gros si tu précises pas la valeur de width, ça sera 1 par défaut. Sinon ça sera celle passé en paramètre. Honnêtement juste avec ça, y a moyen de gérer pas mal de Use cases.

yes carrément ! je garde ça en tête cimer ! :)

deepblue
Niveau 13
25 mars 2020 à 11:44:36

Grosso modo, j'ai 4 types de requêtes qui nécessiterait 4 même méthodes dont les paramètres seraient différents quoi mais dans mon projet, ça n'aurait aucun sens que ces méthodes aient des noms différents.

Dans ce cas et le contexte de "POO python", tu dois donc implémenter 4 classes qui étendent une 5ème classes. La classe parent va exécuter les requêtes selon des paramètres fournis et les classes enfant fournissent ces paramètres (design pattern proxy de mémoire).

lokilok
Niveau 10
25 mars 2020 à 12:29:20

[20:55:07] <[Black_Spirit]>
Je peux pas edit mais une manière encore plus simple avec paramètres par défaut c'est ça.


def area(length, width=1):
   return length * width


print(area(2))  # 4
print(area(2, 3))  # 6

En gros si tu précises pas la valeur de width, ça sera 1 par défaut. Sinon ça sera celle passé en paramètre. Honnêtement juste avec ça, y a moyen de gérer pas mal de Use cases.

2*1 ça fait 2, pas 4.

[Black_Spirit]
Niveau 15
25 mars 2020 à 14:47:06

C'est une erreur de copier coller et je peux pas éditer toute façon.

lokilok
Niveau 10
25 mars 2020 à 15:01:11

Et du coup tu corrigerais ça comment ?

Édit : ou alors j'ai pas compris et le but de la fonction c'est pas de calculer l'air d'un carré.

[Black_Spirit]
Niveau 15
25 mars 2020 à 16:50:26

Si tu veux une méthode area qui marche, suffit de regarder qqes posts au dessus.
Sinon l'exemple c'est surtout pour montrer qu'on peut faire un truc équivalent à la surcharge de méthode Java en python, car on a une même fonction qui peut prendre différents arguments.

1
Sujet : POO python
   Retour haut de page
Consulter la version web de cette page