Programmation Orienté Objet python

Fermé
JASON - 27 nov. 2019 à 01:34
 JASON - 2 déc. 2019 à 02:13
Bonjour,

Je viens par la présente vous demandez de l'aide concernant cet exercice que j'ai bien commencé mais à la fin je bug complètement. C'est un exercice ou il faut compléter les commentaires(apres #).
Voici l'exercice en question:
Dans ce travail, vous devez implémenter les classes: Personne, Etudiant, Employe et Gestion. Le programme principal est déjà implémenté dans le fichier. Vous devez donc compléter toutes les classes.

Classe Personne La classe Personne comprendra les attributs suivants : - nom est une chaine de caractères. - prénom est une chaine de caractères. - identifiant est un nombre entier.

Cette classe dispose les méthodes suivantes : - La méthode __init__() doit initialiser le nom d’un objet de type classe Personne, son prénom et son identifiant. Cette fonction prend en entrée un nom, un prénom de type chaine de caractères et un identifiant de type entier. - La méthode _repr_() doit retourner une chaine de caractères qui contient tous les informations d’une personne. - La méthode _eq_() doit vérifier si deux personnes sont identiques (le même nom, le même prénom et le même identifiant). Cette fonction elle prend en entrée un objet de type Personne et retourne True si les deux personnes sont identiques et False sinon.



Classe Employe La classe Employe dérive de la classe Personne. Cette classe comprendra les attributs suivants : - tauxHoraire est un nombre réel. Cette classe dispose les méthodes suivantes : - La méthode __init__() doit initialiser un objet de type Employe. Cette fonction prend en entrée un nom, un prénom de type chaine de caractères, un identifiant de type entier et un taux de type réel. - La méthode _repr_() doit retourner une chaine de caractères qui contient tous les informations d’un employé. - La méthode calculerSalaire()doit retourner le salaire d’un employé. Elle prend en paramètre le nombre des heures (un nombre entier). Le salaire égale le nombre des heures multiplié par le taux horaire.

Classe Etudiant La classe Etudiant dérive de la classe Personne. Cette classe comprendra les attributs suivants : - solde est un nombre réel (présente le solde à payer pour les frais de scolarité). - cours est une liste de cours (une liste de chaine de caractères). Cette classe dispose les méthodes suivantes : - La méthode __init__() doit initialiser un objet de type Etudiant. Cette fonction prend en entrée un nom, un prénom de type chaine de caractères, un identifiant de type entier, un solde de type réel et une liste de cours. La liste de cours doit être initialisée à une liste de chaine de caractères vide. - La méthode _repr_() doit retourner une chaine de caractères qui contient toutes les informations d’un étudiant. Pour la liste de cours, ajouter seulement le nombre de cours dans la chaine de caractères. - La méthode ajouterCours()doit ajouter un cours dans la liste de cours. Elle prend en paramètre le nom de cours (une chaine de caractères). Un étudiant peut ajouter un cours seulement si il n’a aucun solde à payer (la valeur de solde est égale à zéro). Cette fonction retourne True si le cours a été ajouté dans la liste de cours et False sinon.

Classe Gestion La classe Gestion permet de gérer la liste des étudiants et des employés. Cette classe comprendra deux atributs (statiques) : - Une liste des étudiants listEtudiant. - Une liste des employés listEmploye.

Cette classe ne comprend pas aucuns attributs. Cette classe dispose les méthodes suivantes : - La méthode ajouterEtudiant(). Cette fonction ne prend aucun paramètre en entrée. Elle permet de demander à l’utilisateur les informations pour l’étudiant à ajouter. Par la suite, elle doit demander à l’utilisateur d’entrer un choix : si l’utilisateur veut ajouter un cours (le choix de l’utilisateur doit être oui ou non, sinon afficher un message approprié). Avant d’ajouter l’étudiant, il faut vérifier qu’il n’existe pas dans la liste. Cette fonction elle doit retourner True si l’étudiant a été ajouté et False sinon. - La méthode ajouterEmploye(). Cette fonction ne prend aucun paramètre en entrée. Elle permet de demander à l’utilisateur les informations pour l’employé à ajouter. Avant d’ajouter
l’employé, il faut vérifier qu’il n’existe pas dans la liste. Cette fonction elle doit retourner True si l’employé a été ajouté et False sinon. - La méthode soldeNonPaye(). Cette fonction ne prend aucun paramètre en entrée. Elle permet de calculer et retourner le nombre des étudiants qui ont un solde non payé. - La méthode salaireEmploye(). Cette fonction prend en entrée un employé et le nombre des heures travaillées. Elle permet de calculer et retourner le salaire d’un employé. Si l’employé n’existe pas dans la liste, le salaire est égal à zéro.


voici le code que j'ai fais mais j'ai pas pu terminer:
class Personne:
    '''represente une classe Personne'''
    def __init__(self, nom, prenom, identifiant):
        '''(str,str, int)->None
        initialise les attributs de la classe Personne'''
        self.nom = nom
        self.prenom = prenom
        self.identifiant = identifiant

    def __repr__(self):
        '''(Personne)->str
        retourne une representation de l'objet'''
         return "nom: " + str(self.x) + "prenom: " + str(self.prenom) + "identifiant: " + int(self.identifiant)

    def __eq__(self, autre):
        '''(Personne, Personne)->bool
        self == autre si le nom et le prenom sont les memes'''
        return self.nom == autre.nom and self.prenom == autre.prenom and self.identifiant == autre.identifiant

class Etudiant(Personne):
    '''represente une classe Etudiant'''
     def __init__(self ,nom ,prenom ,identifiant, tauxHoraire):
        Personne.__init__(nom, prenom, identifiant)
        self.tauxHoraire = tauxHoraire

    def __repr__(self):
        '''(Employe)->str
        retourne les informations d'un employé'''
        return "nom: " + str(self.nom) + "prenom: " + str(self.prenom) + "identifiant: " + int(self.identifiant) + "tauxHoraire: " + float(self.tauxHoraire)

    def calculerSalaire(self,nbre):
        '''(int,float)->float
        retourne le salaire d'un employé
        '''
        return "Salaire: " + int(self.nbre)*float(self.tauxHoraire)
    

class Employe(Personne):
    '''represente un employe'''
    # tauxHoraire est un attribut de la classe Employe
    
    # methodes

    # A completer


class Gestion:
 listEtudiant = []
 listEmploye = []
 def ajouterEtudiant(self):
    ''' none -> bool
    ajouter des etudiants dans une liste d'etudiant'''
    # Completer

 def ajouterEmploye(self):
    ''' none -> bool
    ajouter des etudiants dans une liste d'etudiant'''
    # Completer
 def SoldeNonPaye(self):
    ''' none -> int
    retourner le nombre des etudiants qui ont un solde non paye'''
    # Completer

 def salaireInd(self, employe, heures):
    '''(str) -> float
    retourne le salaire d'un employe'''
    # Completer


#program principal
g = Gestion()
print("Ajoutez des etudiants.")
# Ajouter des etudiants
g.ajouterEtudiant()
g.ajouterEtudiant()

# Ajouter des employes
print("Ajouter des employes.")
g.ajouterEmploye()
g.ajouterEmploye()
#g.ajouterEmployes()

# Afficher le nombre des employes et des etudiants
print("il y a: ", len(Gestion.listEtudiant), " etudiants.")
print("il y a: ", len(Gestion.listEmploye), " employes.")
# Afficher le nombre des etudiants qui ont un solde a payer
print("il y a ", g.SoldeNonPaye(), "etudiants qui n'ont pas paye leur solde.")
# Afficher les salaires de tous les employes
for e in Gestion.listEmploye:
    heure = int(input("Entrez le nombre des heures pour employe " + e.prenom + " " + e.nom + " "))
    print('Le salaire de:', e.nom, e.prenom, 'est:', g.salaireInd(e, heure), '$.')

#Afficher toute la Gestion
print("Toute la gestion: ")
print(Gestion.listEtudiant)
print(Gestion.listEmploye)







Configuration: Windows / Edge 18.17763

1 réponse

Bonjour,

Dans Personne.__repr__
- Il est inutile de convertir chaque valeur par leur propre type, ça ne sert à rien du tout.
- self.x n'existe pas.
- Plutôt que d'une concaténation de chaînes, sers-toi de format
return 'nom: {}, prenom: {}, identifiant: {}'.format(self.nom, self.prenom, self.identifiant)


Tu t'es bien mélangé les pinceaux entre Etudiant et Employe, vu que le 5ème argument de l'__init__de Etudiant dans ton code est celui que tu dois définir dans la classe Employe et qu'il y a une méthode calculerSalaire, alors le nom de cette classe doit être Employe et pas Etudiant.

Dans Etudiant.__repr__, self.nbre n'existe pas, c'est nbre (argument de la méthode).

Dans les méthodes ajouterEmploye, ajouterEtudiant de Gestion, tu dois simplement utiliser des input pour demander les valeurs nécessaires à l'instanciation des classes Etudiant et Employe.
Donc pour ajouter un employe, tu dois demander la saisie de 4 valeurs pour pouvoir définir un employé.

Personnellement je trouve la classe Gestion complètement stupide, je ne vois pas pourquoi on devrait gérer étudiants et employés dans cette même classe et y ajouter des méthodes spécifiques à chacune de ces types d'objets.
Pareil pour les identifiants, cela devrait être créé automatiquement par les classes Etudiant et Employé en utilisant une variable de classe, car on peut très bien avoir 2 employés portant même nom et prénom, la seule chose qui les distinguera est donc leur identifiant ce qui fait que Employe.__eq__ n'a pas vraiment de sens.
0
Bonjour,

Merci bien trifou pour ta réponse, la première partie où j'ai mélangé les pinceaux je vois erreur grave donc j'ai rectifié mais le reste je comprends pas très bien, peux tu stp expliquer de façon très explicite comment je suis sensé procéder ?
0
trifou > Jason
28 nov. 2019 à 10:04
Bonjour,

Qu'est-ce que tu ne comprends pas ? Je veux bien expliquer, mais quoi expliquer si tu ne précises pas ce qui te pose soucis -_-
0
Bonjour,

Il y'a des parties du code qu'il me reste à compléter je ne sais ce qu'il faut faire.

Voici le code en question:
class Personne:
    '''represente une classe Personne'''
    def __init__(self, nom, prenom, identifiant):
        '''(str,str, int)->None
        initialise les attributs de la classe Personne'''
        self.nom = nom
        self.prenom = prenom
        self.identifiant = identifiant

    def __repr__(self):
        '''(Personne)->str
        retourne une representation de l'objet'''
        return 'nom: {}, prénom: {}, identifiant: {}'.format(self.nom, self.prenom, self.identifiant)

    def __eq__(self, autre):
        '''(Personne, Personne)->bool
        self == autre si le nom et le prenom sont les memes'''
        return self.nom == autre.nom and self.prenom == autre.prenom and self.identifiant == autre.identifiant

class Etudiant(Personne):
    '''represente une classe Etudiant'''
     def __init__(self, nom, prenom, identifiant, solde, cours = ['']):
         Personne.__init__(nom, prenom, identifiant)
         self.solde = solde
         self.cours = cours

     def __repr__(self):

         return 'nom: {}, prénom: {}, identifiant: {}, solde: {}, cours: {}'.format(self.nom, self.prenom, self.identifiant, self.solde, cours)
     # cours est une liste de cours (une liste de chaine de caracteres)
     
     # methodes
     
     # A completer
    

class Employe(Personne):
    '''represente un employe'''
    def __init__(self ,nom ,prenom ,identifiant, tauxHoraire):
        Personne.__init__(nom, prenom, identifiant)
        self.tauxHoraire = tauxHoraire

    def __repr__(self):
        '''(Employe)->str
        retourne les informations d'un employé'''
        return "nom: " + str(self.nom) + "prenom: " + str(self.prenom) + "identifiant: " + int(self.identifiant) + "tauxHoraire: " + float(self.tauxHoraire)

    def calculerSalaire(self,nbre):
        '''(int,float)->float
        retourne le salaire d'un employé
        '''
        return "Salaire: " + int(self.nbre)*float(self.tauxHoraire)




class Gestion:
 listEtudiant = []
 listEmploye = []
 def ajouterEtudiant(self):
    ''' none -> bool
    ajouter des etudiants dans une liste d'etudiant'''
    # Completer

 def ajouterEmploye(self):
    ''' none -> bool
    ajouter des etudiants dans une liste d'etudiant'''
    # Completer
 def SoldeNonPaye(self):
    ''' none -> int
    retourner le nombre des etudiants qui ont un solde non paye'''
    # Completer

 def salaireInd(self, employe, heures):
    '''(str) -> float
    retourne le salaire d'un employe'''
    # Completer


#program principal
g = Gestion()
print("Ajoutez des etudiants.")
# Ajouter des etudiants
g.ajouterEtudiant()
g.ajouterEtudiant()

# Ajouter des employes
print("Ajouter des employes.")
g.ajouterEmploye()
g.ajouterEmploye()
#g.ajouterEmployes()

# Afficher le nombre des employes et des etudiants
print("il y a: ", len(Gestion.listEtudiant), " etudiants.")
print("il y a: ", len(Gestion.listEmploye), " employes.")
# Afficher le nombre des etudiants qui ont un solde a payer
print("il y a ", g.SoldeNonPaye(), "etudiants qui n'ont pas paye leur solde.")
# Afficher les salaires de tous les employes
for e in Gestion.listEmploye:
    heure = int(input("Entrez le nombre des heures pour employe " + e.prenom + " " + e.nom + " "))
    print('Le salaire de:', e.nom, e.prenom, 'est:', g.salaireInd(e, heure), '$.')

#Afficher toute la Gestion
print("Toute la gestion: ")
print(Gestion.listEtudiant)
print(Gestion.listEmploye)

0
trifou > JASON
28 nov. 2019 à 20:42
Bonsoir,

Je t'ai déjà dit comment faire pour créer étudiants et employés, utilise des input.

Attention à l'indentation, utilise un éditeur de texte dans lequel on peut paramétrer la touche tab pour insérer 4 espaces.

Pour les étudiants.

class Personne:
    '''represente une classe Personne'''
    def __init__(self, nom, prenom, identifiant):
        '''(str,str, int)->None
        initialise les attributs de la classe Personne'''
        self.nom = nom
        self.prenom = prenom
        self.identifiant = identifiant

    def __repr__(self):
        '''(Personne)->str
        retourne une representation de l'objet'''
        s = 'nom: {}, prénom: {}, identifiant: {}'
        return s.format(self.nom, self.prenom, self.identifiant)


class Etudiant(Personne):
    '''represente une classe Etudiant'''
    __id = 0
    def __init__(self, nom, prenom, solde, cours):
        Etudiant.__id += 1
        super().__init__(nom, prenom, Etudiant.__id)
        self.solde = solde
        self.cours = cours

    def __repr__(self):
        s = '{}, solde: {}, cours: {}'
        return s.format(super().__repr__(), self.solde, self.cours)


class Gestion:
    listEtudiant = []
    listEmploye = []
    def ajouterEtudiant(self):
        ''' none -> bool
        ajouter des etudiants dans une liste d'etudiant'''
        nom = input("Nom de l'étudiant : ")
        prenom = input("Prénom de l'étudiant : ")
        solde = input("Solde de l'étudiant : ")
        cours = input("Cours de l'étudiant : ")
        etudiant = Etudiant(nom, prenom, solde, cours)
        self.listEtudiant.append(etudiant)


    def ajouterEmploye(self):
        ''' none -> bool
        ajouter des etudiants dans une liste d'employés'''


    def SoldeNonPaye(self):
        ''' none -> int
        retourner le nombre des etudiants qui ont un solde non paye'''
        return sum(1 for etu in self.listEtudiant if etu.solde != 0)


    def salaireInd(self, employe, heures):
        '''(str) -> float
        retourne le salaire d'un employe'''
        # Completer
        


#program principal
gestion = Gestion()
print("Ajoutez des etudiants.")
# Ajouter des etudiants
gestion.ajouterEtudiant()
gestion.ajouterEtudiant()

# Ajouter des employes
# print("Ajouter des employes.")
# g.ajouterEmploye()
# g.ajouterEmploye()
# g.ajouterEmployes()

# Afficher le nombre des employes et des etudiants
print("il y a: ", len(gestion.listEtudiant), " etudiants.")
print("il y a: ", len(gestion.listEmploye), " employes.")
# Afficher le nombre des etudiants qui ont un solde a payer
print("il y a ", gestion.SoldeNonPaye(), "etudiants qui n'ont pas paye leur solde.")
# Afficher les salaires de tous les employes
"""
for e in Gestion.listEmploye:
    heure = int(input("Entrez le nombre des heures pour employe " + e.prenom + " " + e.nom + " "))
    print('Le salaire de:', e.nom, e.prenom, 'est:', g.salaireInd(e, heure), '$.')
"""
#Afficher toute la Gestion
print("Toute la gestion: ")
print("Etudiants :")
for etudiant in gestion.listEtudiant:
    print(etudiant)

# print(Gestion.listEmploye)


- J'ai viré la méthode __eq__ de Personne, qui ne sert à rien.
- Les identifiants sont gérés automatiquement par la classe Etudiant, il te faudra faire de même pour la classe Employe.
- super() réfère à la classe parente, comme tu vois on s'en sert dans l'__init__ de Etudiant et aussi dans __repr__

A toi de faire la même chose pour les employés.
0
Bonjour,

Merci bien trifou tu en a déjà assez faire. Le reste je le ferais
0