des classes de classes ?

Le language python permet-il de créer des "classes de classes"

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis débutant en python (et en programmation en général) et je me pose une petite question : est-il possible de de créer des classes de classes ?

Petit exemple : Admettons que je veuille recréer le jeu Pokémon. Pour ce faire j'ai besoin de créer une classe pour chaque attaque. Ceci dis toutes le les attaques ont les mêmes caractéristiques (puissance, pp, chance de crit., etc…); il me semble donc lourd et assez peu élégant de recopier pour chaque attaque les mêmes propriétés. Pourtant, il faut que chaque attaque soit une classe à part entière afin pouvoir les modifier au cas par cas pour chaque pokémon (ex : en utilisant un pp+).

Voilà le problème. :)

Merci d'avance pour vos réponses.

Jespar

Salut,

Ce mécanisme que tu appelles "classe de classe" s'appelle en réalité l'héritage et oui, comme beaucoup (tous ?) de langages objet, tu peux l'utiliser.

Donc ne t'inquiète pas c'est effectivement possible, on ne commence pas par présenter ça dans les tutos donc si tu es débutant c'est normal que tu n'en aies pas entendu parler, mais ça va venir ;)

Lu'!

Pour ce faire j'ai besoin de créer une classe pour chaque attaque.

Jespar

Surtout pas malheureux.

Ceci dis toutes le les attaques ont les mêmes caractéristiques (puissance, pp, chance de crit., etc…); il me semble donc lourd et assez peu élégant de recopier pour chaque attaque les mêmes propriétés.

Jespar

Les éléments d'un même type peuvent être tous d'une même classe de base puis par héritage on peut créer différentes dérivations qui auront les mêmes attributs, la même interface, et à moins de modifier l'implémentation des fonctions de cette interface, le même comportement.

Mais pour un jeu type Pokémon, et de manière générale pour les RPGs, et pour tous systèmes proposant d'avoir une très grande variété de comportements et différents assemblages de comportements dans les entités modélisées, la programmation orientée objet montre rapidement ses limites.

Un peu de lecture : http://openclassrooms.com/forum/sujet/comment-structurer-un-jeu-en-c

Le début étant ce qu'il ne faut pas faire, la suite, des éléments de réponses préliminaires.

tout d'abord, merci pour vos réponses si rapides (quelle communauté ! :D ).

Ensuite:

@Theo: OK, je vois en effet que "l'héritage" est le titre d'un des chapitres du tuto que je suis :) (j'y arrive dans peu de temps).

@Ksass`Peuk: Merci pour ton lien :) et, ne t'en fait pas, je ne suis pas vraiment entrain de recréer Pokémon :p .

Jespar

Ce que Ksass`Peuk veut dire par son "Surtout pas, malheureux", c'est qu'il ne faut pas créer une classe par attaque.

Une classe, c'est un "moule" pour créer plein d'objets (ou instances, pour être précis) qui se ressemblent.

Par exemple, une classe Attaque est très judicieuse. Même si les attaques sont toutes différentes, elles ont toutes la même structure (un nom, une puissance, un nombre de PP, un type, une animation…).

En revanche, une classe Ultralaser, c'est pas utile. L'Ultralaser de Léviathor est le même que celui de Dracolosse, donc c'est pas la peine d'en faire une classe.

En revanche, une classe Ultralaser, c'est pas utile. L'Ultralaser de Léviathor est le même que celui de Dracolosse, donc c'est pas la peine d'en faire une classe.

Richou D. Degenne

En effet, ceci dit, si j'utilise un pp+ sur l'ultralaser de mon léviathor et pas sur celui de mon dracolosse ?

@Jespar,

Il existe un objet très pratique lorsqu'on utilise que des attributs de classe, c'est les namedtuple

Autre lien, concernant les namedtuple, dans un paragraphe du livre de Tarek Ziade.

fred1599

Ça ressemble un peu à un dictionnaire… Il y a une différence ? (Je ne suis pas sur d'avoir bien compris :D )

note : il est peu probable que les attaques pokémons utilisent seulement des attributs (ne serait-ce que pour empêcher de dépasser les pp max par exemple).

En tout cas merci pour vos réponses. :)

Jespar

En revanche, une classe Ultralaser, c'est pas utile. L'Ultralaser de Léviathor est le même que celui de Dracolosse, donc c'est pas la peine d'en faire une classe.

Richou D. Degenne

En effet, ceci dit, si j'utilise un pp+ sur l'ultralaser de mon léviathor et pas sur celui de mon dracolosse ?

Jespar

C'est l'objet (une instance de classe) que chaque pokémon va posséder. Pas une classe. Donc dans l'idée tous les pokemons ont des attaques (des objets, des instances de la classe "Attaque") avec comme attributs les PP + bonus PPmax, et un lien vers la description immuable de l'attaque (une instance de la classe décrivant l'attaque et ses caractéristiques de base).

Tu as lu mes liens ?

Ça ressemble un peu à un dictionnaire… Il y a une différence ?

Comme son nom l'indique, se sont des tuples (objets connus en python) nommés qui permettent de rendre le code plus lisible et intuitif.

note : il est peu probable que les attaques pokémons utilisent seulement des attributs (ne serait-ce que pour empêcher de dépasser les pp max par exemple).

Pourquoi pas ? Ça peut se gérer en externe par des fonctions, à l'intérieur d'autres classes, autres…

@Ksass`Peuk: Mais alors, ça veut dire que pour chaque pokémon avec la même attaque je dois redéclarer cette attaque avec tous ses attributs non ?

Tu as lu mes liens ?

fred1599

Oui, mais je ne suis pas sûr d'avoir tout compris

Comme son nom l'indique, se sont des tuples (objets connus en python) nommés qui permettent de rendre le code plus lisible et intuitif.

fred1599

d’accord, merci. :)

Pourquoi pas ? Ça peut se gérer en externe par des fonctions, à l'intérieur d'autres classes, autres…

fred1599

En effet, c'est juste que par rapport à la logique "objet" ça me parait plus propre. (après, je ne suis pas un expert :) )

@Ksass`Peuk: Mais alors, ça veut dire que pour chaque pokémon avec la même attaque je dois redéclarer cette attaque avec tous ses attributs non ?

Jespar

Pas vraiment. Tu pourrais avoir une fonction pour charger une attaque générique (au sens : les données de base de l'attaque) dans celles qui existent dans la base du jeu. Une fonction qui à partir de cette attaque produit l'attaque personnelle du pokémon qui commence en mettant les PP au maximum et le bonus à 0.

Je sais pas l'écrire en Python (je fais du C++) donc pseudo-code inside :

1
attack = create_base_attack(load("Ultralaser"));

Oublie la "logique objet".

Ce qui est propre en Python, c'est de faire un code simple, lisible et facile à maintenir : parfois, ça signifie s'affranchir du moule de la POO, ou plutôt ne designer en objet que ce qui en vaut la peine.

La "logique objet" doit rester un moyen et ne jamais devenir une fin en soi.

+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