3 votes

Problèmes d'héritage en Python

Ceci est une question de devoir, mais comme vous pouvez le voir, j'ai déjà écrit la plupart du code. :) Ce que j'essaie de faire, c'est que l'objet Agent hérite des méthodes de l'objet Investisseur, car les méthodes de l'objet Agent sont censées être essentiellement les mêmes. La seule différence concerne les constructeurs, Investisseur prend 6 paramètres, Agent en prend 7. Vous pouvez voir que les paramètres sont fondamentalement les mêmes.

Investisseur.load et Investisseur.report fonctionnent, pour la plupart, comme prévu. Les méthodes héritées dans Agent ne fonctionnent pas. Voir ci-dessous.

Mes problèmes principaux:

  1. Lorsque j'exécute report(o) sur Investisseur, la sortie est légèrement perturbée. Il y a de petits symboles de paragraphe à la fin de chaque ligne, plutôt qu'un saut de ligne. (Je développe sur Linux)
  2. Lorsque j'exécute load et report sur Agent, mes tableaux (rapports et données) ne sont pas populés comme ils devraient l'être. En raison de cela, report n'affiche rien. Comment puis-je configurer mes variables de classe pour qu'elles fonctionnent comme je le souhaite?

Merci!

Je vais réajouter après la date limite de remise.

Voici comment le code ci-dessus devrait fonctionner.

>>> à partir de sys, importer stdout comme o
>>> import datetime
>>> de hedgefunds import *
>>>
>>> i = Investisseur('Flintstone','Fred',datetime.date(1965,12,3),'mâle','M.')
>>>
>>> je
Investisseur('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'mâle', 'M.', 1)
>>> repr(i)
"Investisseur('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'mâle', 'M.', 1)"
>>> i.__repr__()  # CELA CONTROLE LES DEUX LIGNES PRÉCÉDENTES
"Investisseur('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'mâle', 'M.', 1)"
>>> eval(repr(i))  # L'OBJET PEUT ÊTRE RECRÉÉ DEPUIS SA CHAÎNE REPRÉSENTATIVE
Investisseur('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'mâle', 'M.', 1)
>>>
>>> je  # REMARQUEZ UNE DONNÉE SUPPLÉMENTAIRE QUE NOUS N'AVONS PAS SPÉCIFIÉE ?
Investisseur('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'mâle', 'M.', 1)
>>> # LE '1' À LA FIN EST L'ID DE L'ENREGISTREMENT rid. LA CHAÎNE REPR INCLUT TOUTES LES DONNÉES DONC VOUS LE VOYEZ.
>>> # LA CLASSE INVESTISSEUR DEVRAIT ATTRIBUER UN rid SI UN N'EST PAS PASSÉ DANS LE CONSTRUCTEUR.
>>>
>>> imprimer i
1, M. Fred Flintstone, 03/12/1965, mâle
>>> i.__str__()  # CELA CONTRÔLE LA LIGNE PRÉCÉDENTE
'1, M. Fred Flintstone, 03/12/1965, mâle'
>>>
>>> # REMARQUEZ QUE LE NOM EST BIEN ASSEMBLÉ ET L'IDENTIFIANT EST AU DÉBUT
>>> # REMARQUE datetime.date(AAAA, MM, JJ) MAIS NOUS IMPRIMONS AU FORMAT MM/JJ/AAAA
>>>
>>> # MAINTENANT VOYONS LES ATTRIBUTS DE NOTRE OBJET INVESTISSEUR
>>> i.nom_de_famille
'Flintstone'
>>> i.prénom
'Fred'
>>> i.dob
datetime.date(1965, 12, 3)
>>> i.date_de_naissance
'12/03/1965'
>>> i.sexe
'mâle'
>>> i.titre
'M.'
>>> i.nom
'M. Fred Flintstone'
>>> i.rid
1 
>>>
>>> # MAIS NOUS ALLONS DEVOIR STOCKER PLUSIEURS OBJETS INVESTISSEURS QUELQUE PART
>>> # DONC EN PLUS DE CRÉER DES OBJETS INVESTISSEURS, LA CLASSE INVESTISSEUR DOIT AGIR COMME UN JEU D'ENREGISTREMENTS
>>>
>>> Investisseur.rapport(o)  # o A ÉTÉ DÉFINI SUR STDOUT AU DÉBUT DE CETTE TRACE MAIS POURRAIT ÊTRE N'IMPORTE QUEL FICHIER
>>> Investisseur.ajouter(i)  # AUCUN ENREGISTREMENT DONC AJOUTONS-EN UN
>>> Investisseur.rapport(o)  # MAINTENANT NOUS AVONS QUELQUE CHOSE À SIGNALER
1, M. Fred Flintstone, 03/12/1965, mâle
>>>
>>> Investisseur.ajouter(Investisseur('Flintstone','Wilma',datetime.date(1968,1,15),'femme','Mme.'))
>>> Investisseur.rapport(o)
1, M. Fred Flintstone, 03/12/1965, mâle
2, Mme. Wilma Flintstone, 15/01/1968, femme
>>>

>>> # NOUS POURRIONS CONTINUER À AJOUTER DES INVESTISSEURS MANUELLEMENT MAIS PUISQUE NOUS AVONS UN FICHIER PLEIN D'ENTRE EUX....
>>> Investisseur.charger('investisseurs.csv')
>>> Investisseur.rapport(o)
1, M. Charles Creed, 05/12/1928, mâle
2, Miss Sheila Geller, 12/11/1962, femme
3, M. Fred Kenobi, 13/07/1957, mâle
4, Miss Rachel Geller, 11/07/1968, femme
5, M. Charles Rubble, 23/09/1940, mâle
6, Mme. Leah Skywalker, 02/07/1929, femme
7, M. Bill Balboa, 06/03/1988, mâle
8, Dr. Sheila Barkley, 26/08/1950, femme
.
.
>>> # VOUS DEVRIEZ VOIR 120 ENREGISTREMENTS (NOS DEUX ENREGISTREMENTS AJOUTÉS MANUELLEMENT ONT DISPARU)
>>>
>>>
>>>
>>> # AGENTS
>>>
>>> a = Agent(2.1,'Rubble','Barney',datetime.date(1966,4,20),'mâle','M.')
>>> a
Agent(2.1000000000000001, 'Rubble', 'Barney', datetime.date(1966, 4, 20), 'mâle', 'M.', 1)
>>> repr(a)
"Agent(2.1000000000000001, 'Rubble', 'Barney', datetime.date(1966, 4, 20), 'mâle', 'M.', 1)"
>>> eval(repr(a))
Agent(2.1000000000000001, 'Rubble', 'Barney', datetime.date(1966, 4, 20), 'mâle', 'M.', 1)
>>> print a
1, M. Barney Rubble, 20/04/1966, mâle, 2.1
>>> a.nom_de_famille
'Rubble'
>>> a.prénom
'Barney'
>>> a.dob
datetime.date(1966, 4, 20)
>>> a.date_de_naissance
'20/04/1966'
>>> a.sexe
'mâle'
>>> a.titre
'M.'
>>> a.nom
'M. Barney Rubble'
>>> a.rid
1
>>> a.commission
2.1000000000000001
>>> Agent.ajouter(a)
>>> Agent.rapport(o)
1, M. Barney Rubble, 20/04/1966, mâle, 2.1
>>> Agent.charger('agents.csv')
>>> Agent.rapport(o)
1, M. Barney Flintstone, 13/02/1933, mâle, 4.0
2, Miss Rachel Rubble, 21/11/1982, femme, 2.5
3, Dr. Ted Geller, 14/03/1963, mâle, 8.0
4, Miss Phoebe Creed, 06/11/1959, femme, 5.5
5, M. Luke Kenobi, 24/08/1945, mâle, 2.5
6, Dr. Megan Creed, 26/03/1957, femme, 5.5
7, M. Ted Rubble, 14/09/1931, mâle, 3.5
8, Mme. Monica Balboa, 07/05/1934, femme, 1.5

2voto

cwallenpoole Points 34940

Il se passe beaucoup de choses ici, donc je vais essayer d'être bref.

class Investor(object):
    reports = []
    data = []

    def __init__(self, LastName, FirstName, Date, Gender, Title, Rid=1):
        # les deux lignes suivantes définissent des variables qui n'existent que dans
        # __init__, donc elles peuvent essentiellement être supprimées.
        # reports = []
        # data = []
        # mais elles *n'ont pas besoin d'être initialisées*. Créer en fait une nouvelle liste
        # dans chaque constructeur est *mauvais* à moins que vous vouliez un rapport par instance

        # ... plus tard, assurez-vous d'ajouter "self" au lieu d'ajouter aux variables locales
        self.add(self)

    @classmethod
    def report(self, o):
        result = ""
        for x in self.reports:
            # Utilisez simplement join, c'est ce que vous voulez de toute façon.
            result = ', '.join(x)
            # \n devrait entraîner \n\n. Je pense que vous voulez dire o.write(result)
            o.write(result + "\n")

    @classmethod
    def load(self, f):
        self.reports = []
        self.data = []
        file = open(f)
        # pourquoi la lecture supplémentaire?
        file.readline()
        list = []
        while 1:
            line = file.readline()
            # vous devez vous débarrasser de l'espace blanc terminal
            items = line[:-1].split(", ")
            if not line:
                break
            else:
                # ici, self, fait référence à la classe, donc vous pouvez l'utiliser comme le
                # constructeur également
                # utilisez * pour faire une liste en une liste d'arguments.
                self(*items)
                # Pas besoin de l'ajouter, la valeur est ajoutée à la fin de __init__
                # telles qu'elles sont.

class Agent(Investor):
    reports = []
    data = []

    def __init__(self, Commission, LastName, FirstName, \
                       Date, Gender, Title, Rid=1):
        super(Agent, self).__init__(self, LastName, FirstName, Date, \
                                          Gender, Title, Rid)
        self.commission = Commission

    def __str__(self):
        # Soyez paresseux! Utilisez super!
        return super(Agent,self).__str__() + ', ' + self.commission

    # cela faisait la même chose dans la classe parent.
    # def __repr__(self):

    # Les méthodes de classmethod ne sont pas nécessaires à moins que vous ne vouliez redéfinir
    # le comportement dans une classe enfant.
    @classmethod
    def add(self, i):
        # Si vous changez quelque chose, cependant, assurez-vous d'utiliser super
        # ici aussi...
        super(Agent, self).add(i)

Je crois que cela devrait résoudre la plupart de vos problèmes.

Si vous souhaitez avoir le format Investor('Flintstone', 'Fred', datetime.date(1965, 12, 3), 'male', 'Mr.', 1), vous devrez inclure le __name__ et citer les propriétés :

def __repr__(self):
    # remarquez les " et ' ci-dessous.
    return self.__name__ + "('" + str(self.rid) + "', '" + \
           self.name + "', " + self.date_of_birth + ", '" + self.gender + "')"

Dans Agent, vous devrez utiliser une sous-chaîne pour obtenir ce dont vous avez besoin :

def __repr__(self):
   # retirez le Agent( afin de pouvoir ajouter la commission au *début*
   s = super(Agent,self).__str__()
   return self.__name__ + "('" + self.commission + "'," + \
          s[len(self.__name__ + 1):]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X