Partage
  • Partager sur Facebook
  • Partager sur Twitter

héritage et surcharge de méthode

    13 août 2019 à 12:22:27

    Hello,

    Je suis en train de jouer un peu avec l'héritage de classe de python, et je suis face à un petit souci. J'ai deux classes comme suit : 

    class Card(db.Model):
        __tablename__ = 'card'
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), index=True, unique=True)
        type = db.Column(db.String(64))
        hasBeenPlayed = db.Column(db.Boolean, default=False)
        playerId = db.Column(db.Integer, db.ForeignKey('player.id'))
        description = db.Column(db.String(200))
        __mapper_args__ = {
            'polymorphic_on': type,
            'polymorphic_identity': 'card'
        }
    
        def __repr__(self):
            return '<Card {}> : {}'.format(self.name, self.description)
    
        def power(self):
            pass
    
        def play(self):
            self.power()
            self.hasBeenPlayed = True
    
    class King(Card):
        __mapper_args__ = {
            'polymorphic_identity': 'king'
        }
    
        def power(self, pawnsMovements):
            for pawn in pawnsMovements:
                pawn.advance(13)
            else:
                pawn.goOut()

    mon problème est au niveau des méthodes play() et power().

    play(self) a pour rôle d'appeler le pouvoir (power()) d'une carte, et de passer son attribut "hasBeenPlayed" a True. Power(self, args) a pour objectif de réaliser diverses actions sur des pions.

    Ma classe abstraite Card() ne prend aucun argument dans sa méthode power() (à part self, bien entendu), alors que ma classe King() en prend un. Comment faire pour appeler la méthode play() de King en lui passant des arguments ? Est-ce que je dois la surcharger ? utiliser *args ou *kwargs ?

    J'espère être clair dans ma demande, et que quelqu'un pourra m'aider :-)

    • Partager sur Facebook
    • Partager sur Twitter
    Avide de connaissances en électronique/dév/admin sys/db/réseau !
      13 août 2019 à 16:52:29


      ftassy a écrit:

      play(self) a pour rôle d'appeler le pouvoir (power()) d'une carte, et de passer son attribut "hasBeenPlayed" a True. Power(self, args) a pour objectif de réaliser diverses actions sur des pions.

      Si les méthodes power de Card et power de King sont sans rapport, peut être faudrait-il leur donner des noms différents genre pawn_move pour le second.

      -
      Edité par mps 13 août 2019 à 16:52:51

      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2019 à 23:48:17

        hé bien sémantiquement, power() de King, de Queen ou de n'importe lequel de mes autres types de carte a pour moi la même finalité (agir sur un pion).

        Card est un peu "à part" car c'est une classe abstraite, jamais je n'instancierai d'objet de type Card.

        Au final, j'ai réussi à faire fonctionner mon truc de la manière suivante :

        class Card(db.Model):
            __tablename__ = 'card'
        
            id = db.Column(db.Integer, primary_key=True)
            name = db.Column(db.String(64), index=True, unique=True)
            type = db.Column(db.String(64))
            hasBeenPlayed = db.Column(db.Boolean, default=False)
            playerId = db.Column(db.Integer, db.ForeignKey('player.id'))
            description = db.Column(db.String(200))
            __mapper_args__ = {
                'polymorphic_on': type,
                'polymorphic_identity': 'card'
            }
        
            def __repr__(self):
                return '<Card {}> : {}'.format(self.name, self.description)
        
            def power(self, *args):
                pass
        
            def use(self, *args):
                self.power(*args)
                self.hasBeenPlayed = True

        power() de Card attends n arguments (*args), qui sont passés à mon instance de carte par card.use().

        Je ne sais en revanche pas si il s'agit d'une bonne pratique ou pas.

        • Partager sur Facebook
        • Partager sur Twitter
        Avide de connaissances en électronique/dév/admin sys/db/réseau !

        héritage et surcharge de méthode

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown