CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

POO python

MonsieurBeauf
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]
[Black_Spirit]
Niveau 19
24 mars 2020 à 19:09:05

Nope, pas possible.

AlainTest1
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://www.jeuxvideo.com/forums/42-51-62534259-1-0-1-0-qui-pour-discord.htm
Je suis peu présent sur le forum.

Message édité le 24 mars 2020 à 19:26:53 par AlainTest1
[Black_Spirit]
[Black_Spirit]
Niveau 19
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
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
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://www.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]
[Black_Spirit]
Niveau 19
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.

Message édité le 24 mars 2020 à 19:56:21 par [Black_Spirit]
MonsieurBeauf
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é

Message édité le 24 mars 2020 à 20:22:16 par MonsieurBeauf
[Black_Spirit]
[Black_Spirit]
Niveau 19
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.

Message édité le 24 mars 2020 à 20:37:07 par [Black_Spirit]
MonsieurBeauf
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]
[Black_Spirit]
Niveau 19
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.

Message édité le 24 mars 2020 à 20:57:22 par [Black_Spirit]
MonsieurBeauf
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
deepblue
Niveau 16
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
lokilok
Niveau 16
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]
[Black_Spirit]
Niveau 19
25 mars 2020 à 14:47:06

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

lokilok
lokilok
Niveau 16
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é.

Message édité le 25 mars 2020 à 15:03:16 par lokilok
[Black_Spirit]
[Black_Spirit]
Niveau 19
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.

Message édité le 25 mars 2020 à 16:51:13 par [Black_Spirit]
Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment