0
votes

Définir une méthode de classe en dehors d'une classe en Python

Je crée un jeu avec Pygame où il y aura de nombreux écrans différents. Je crée un cours appelé Screen qui aura des écrans personnalisés faits pour vous. J'ai besoin que chaque écran ait des événements et des déclencheurs différents, donc je ne peux pas simplement définir une fonction dans la classe. J'ai besoin de fonctions séparées pour chaque écran, ce qui voudrait dire que je dois définir des fonctions en dehors de la définition de classe pour chaque écran. Je ne sais pas si cela est possible mais il serait bon de le savoir. Je ne suis pas encore allé trop loin mais voici le code:

import pygame


class Screen:
    def __init__(self, size, bg_color, bg_image):
        self.size = size
        self.bg_color = bg_color
        self.bg_image = bg_image
        self.layers = []
        self.screen = pygame.display.set_mode(self.size)

    # some code was taken out here to save space (it was just some x y width and height getters and setters)

    def add_item(self, item, layer=None):
        if layer is None:
            self.layers.append(item)
        else:
            self.layers.insert(layer, item)

    def remove_item(self, item):
        self.layers.remove(item)

    def draw(self):
        self.screen.fill(self.bg_color)
        self.screen.blit(self.bg_image)

        for item in self.layers:
            self.screen.blit(item, item.pos)


3 commentaires

Peut-être créer une classe de base pour les écrans et spécialiser chaque écran en utilisant l'héritage? Veuillez publier un exemple simplifié de mvce .


Qu'est-ce que tu as fait?


Une solution peut être de créer une classe Screen et de créer différentes fonctions dans cette classe pour chaque écran différent. C'est ce que j'ai fait pour mon jeu que j'ai fait avec PyGame


3 Réponses :


0
votes

vous pouvez simplement créer une fonction normale en dehors de la classe et la passer comme l'un des arguments à votre classe.


0 commentaires

1
votes

Vous pouvez procéder de deux manières:

  1. Un a déjà été donné par NinjaFaraz. Vous définiriez simplement des fonctions en dehors de votre classe et créeriez un dict ou une liste avec les fonctions disponibles pour chaque écran. Vous pouvez même passer de nouvelles fonctions pendant l'exécution de votre programme pour améliorer ou réduire dynamiquement la fonctionnalité des écrans.

  2. La deuxième option est l'héritage. Cela n'a de sens que si pas trop de types d'écrans sont nécessaires. Si tel est le cas, vous pourriez avoir une classe de base "Screen" avec vos fonctions de base et tous les autres écrans hériteraient de cette classe. Cela a du sens si les classes ne peuvent pas gagner / perdre de nouvelles fonctions de manière dynamique.

Laquelle des deux approches est la meilleure dépend de votre situation spécifique et ne peut pas encore être répondu avec les informations que vous avez fournies.


0 commentaires

0
votes

J'ai besoin que chaque écran ait des événements et des déclencheurs différents

Vous recherchez donc l' héritage . En savoir plus sur l' héritage et le polymorphisme en Python Utilisez Screen comme classe de base. Dérivez différentes classes de Screen , où vous pouvez implémenter différents comportements:

class Screen_2(Screen):
    def __init__(self, size, bg_color, bg_image):
        super().__init__(size, bg_color, bg_image)

    def my_method():
        # do something different
        # [...]
class Screen_1(Screen):
    def __init__(self, size, bg_color, bg_image):
        super().__init__(size, bg_color, bg_image)

    def my_method():
        # do something
        # [...]
class Screen:
    def __init__(self, size, bg_color, bg_image):
        # [...]
  
    # [...]

0 commentaires