Problème programmation jeu python "La bataille"
mamiemando Messages postés 33380 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 4 déc. 2023 à 15:11
- Problème programmation jeu python "La bataille"
- 94 jeu - Télécharger - Puzzle & Réflexion
- Jeu zuma - Télécharger - Jeux vidéo
- Citizen code python avis - Accueil - Outils
- Application de programmation - Guide
2 réponses
Modifié le 4 déc. 2023 à 14:59
Bonjour,
Je ne comprends comment utiliser les méthodes "equality" ...
Donc, ce n'est pas toi qui a écrit le code. Si tu parles de la méthode __eq__ par exemple, il s'agit de la surcharge de l'opérateur == qui permet de comparer 2 objets.
On utilise de genre de méthode lorsque == doit être (re)défini. Par exemple dans ton cas, on veut comparer 2 cartes, donc on ne peut pas écrire directement:
if carte_1 == carte_2
En python, on ne peut le faire que sur certains types (notamment les valeurs numériques, les chaînes de caractères, les listes, etc) mais pas sur des objets Carte
On utilise donc ce type de surcharge d'opérateur défini dans la classe, pour pouvoir écrire ensuite
if carte_1 == carte_2
Idem pour __lt__ (<), __gt__ (>), et même __str__ qui permet de faire un print d'un objet Carte.
Ceci dit, tu n'appelles jamais la fonction game(), donc il ne se passe rien.
4 déc. 2023 à 15:11
Bonjour,
Pour préciser la réponse déjà très complète de Phil_1857, la méthode __lt__ est invoquée lorsqu'on fait appel à l'opérateur <, ce qui donne l'opportunité de (re)-définir son comportement en la surchargeant. C'est le même principe pour tout opérateur en python (voir la liste complète des opérateurs et leur méthodes correspondantes ici).
Dans l'extrait de code ci-dessous, je mets en évidence l'appel à la méthode ainsi surchargée, et à son appel au travers de l'opérateur :
class Object: def __init__(self, x: int = 0): self.x = x def __lt__(self, obj) -> bool: print(f"__lt__({self}, {obj})") return self.x < obj.x def __str__(self) -> str: return f"Object<x={self.x}>" o1 = Object(1) o2 = Object(2) print("o1 < o2 =", o1 < o2) print("o1 < o2 =", o1.__lt__(o2))
Résultat :
__lt__(Object<x=1>, Object<x=2>)
o1 < o2 = True
__lt__(Object<x=1>, Object<x=2>)
o1 < o2 = True
Note qu'en python, il y a deux manière de convertir un object en python :
- via __str__ (ce qui correspond à %s dans une chaîne de formatage) ;
- via __repr__ (ce qui correspond à %r dans une chaîne de formatage).
class Object: def __init__(self, x: int = 0): self.x = x def __str__(self) -> str: return f"Object<x={self.x}>" def __repr__(self) -> str: return f"<x={self.x}>" o = Object(1) print(o) print("Avec __str__:") print("%s" % o) print(str(o)) print(o.__str__()) print("Avec __repr__:") print("%r" % o) print(repr(o)) print(o.__repr__())
... ce qui donne :
Object<x=1>
Avec __str__:
Object<x=1>
Object<x=1>
Object<x=1>
Avec __repr__:
<x=1>
<x=1>
<x=1>
Bonne chance