Partage

recherche dans une classe

Sujet résolu
14 juin 2018 à 0:20:47

bonsoir

je galere depuis sur une fonction depuis un moment. je veux ecrire une fonction pour rechercher un nom dans un ensemble de liste et si la fonction retrouve le nom en question elle pourra l'afficher.

merci pour votre aide

voici le code

class Societe:

    def __init__(self, liste_employes):
        self.liste_employes = liste_employes


    def rechercheNom(self):

        print("Entrez le nom de l'employe:")
        while True:
            nom_employe = input("-> ")
            for k in self.liste_employes:
                if nom_employe == k:
                    
                    return nom_employe
                else:
                    print("Le nom n'existe pas")


class Employe:

    liste_employes = list()

    def __init__(self, nom, departement, matricule):
        self.nom = nom
        self.departement = departement
        self.matricule = matricule
        Employe.liste_employes.append(self)

societe = Societe(Employe.liste_employes)
jean = Employe("jean", "rh", 90)
henri = Employe("henri", "compta", 99)
job = Employe("job", "dsi", 9)



Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
14 juin 2018 à 2:32:29

j'ai l'impression que le code fonctionne pas parce que après des test même quand le nom n'est pas dans la liste des employés il le retrouve
14 juin 2018 à 5:58:42

Ha oui c'est pas normal, il devrait te retourner que le nom n'existe pas puisque tu compares un string avec un objet employe au lieu de l'attribut nom.
14 juin 2018 à 8:06:47

josmiley a écrit:

Ha oui c'est pas normal, il devrait te retourner que le nom n'existe pas puisque tu compares un string avec un objet employe au lieu de l'attribut nom.


et en même temps c'est pas normal de tester si une string est égale à un objet :p

voila la fonction corrigée

    def rechercheNom(self):
 
        print("Entrez le nom de l'employe:")
        while True:
            nom_employe = raw_input("-> ")
            for employe in self.liste_employes:
                if nom_employe == employe.nom:
                    print("Le nom existe")
                    return nom_employe
                else:
                    print("Le nom n'existe pas")



-
Edité par silent auben 14 juin 2018 à 8:16:06

Anonyme
14 juin 2018 à 9:05:45

La fonction rechercheNom devrait au moins avoir un paramètre indiquant le nom à chercher, puis elle ne devrait pas avoir de fonction input, c'est ultra pas propre en ce qui concerne la conception... En fait ça ne prend que très peu de lignes cette fonction mais conceptuellement, elle n'a pas lieu d'exister pour ce qu'on demande de faire.

14 juin 2018 à 13:45:01

bonjour merci pour vos reponses mais j'ai un message d'erreur NameError: name raw_input is not defined

oldProgrammer a écrit:

La fonction rechercheNom devrait au moins avoir un paramètre indiquant le nom à chercher, puis elle ne devrait pas avoir de fonction input, c'est ultra pas propre en ce qui concerne la conception

pourrais tu me proposer quelque chose?

-
Edité par hri 14 juin 2018 à 13:50:23

Anonyme
14 juin 2018 à 14:13:01

hri a écrit:

bonjour merci pour vos reponses mais j'ai un message d'erreur NameError: name raw_input is not defined

Ce n'est pas ton code de départ, je me trompe ? Peux-tu donner à partir de ton code le traceback (copié collé) renvoyé ?

hri a écrit:

pourrais tu me proposer quelque chose?

Eh bien je l'ai dis, ne pas s'embêter à créer une méthode inutile comme rechercheNom, qui se traduit par une seule ligne dans une autre fonction si on devait vérifier si un nom existe.

if nom in self.liste_employes:
    # suite du code



14 juin 2018 à 15:11:02

def rechercheNom(self):
 
        print("Entrez le nom de l'employe:")
        while True:
            nom_employe = input("-> ")
            for employe in self.liste_employes:
                if nom_employe == employe.nom:
                    print("trouve")
                    return nom_employe
                else:
                    print("Le nom n'existe pas")
j'ai modifié le code il trouve le nom dans les listes mais le probleme est que si le nom recherché se retrouve dans une dixième liste plus tard il va afficher qu'il ne trouve le nom jusqu' a ce que le nom soit retrouvé, c'est pas le resultat attendu
14 juin 2018 à 15:30:14

Comme te l'a dit oldProgrammer tu as une méthode native qui fait la meme chose, elle est donc a prioritiser.

if nom in list_nom:
  #instruction



14 juin 2018 à 16:29:02

thetui a écrit:

Comme te l'a dit oldProgrammer tu as une méthode native qui fait la meme chose, elle est donc a prioritiser.

if nom in list_nom:
  #instruction



ce n'est justement pas une liste de noms mais d'objets. Il a créé une liste d'objets Employé dans lequel il doit vérifier que l'un a comme nom celui défini. Donc il doit boucler sur cette liste pour vérifier chaque nom.

A moins de définir dans la classe une liste de nom qui sera incrémenté des noms des salarié, il pourra tester l’existence de celui ci dans une liste

-
Edité par silent auben 14 juin 2018 à 16:34:06

Anonyme
14 juin 2018 à 16:37:15

silent auben a écrit:

thetui a écrit:

Comme te l'a dit oldProgrammer tu as une méthode native qui fait la meme chose, elle est donc a prioritiser.

if nom in list_nom:
  #instruction



ce n'est justement pas une liste de noms mais d'objets.

Sur le principe ça ne change rien... Mais si on va plus loin, conceptuellement, liste_employes n'a rien à faire dans la classe Employe.

14 juin 2018 à 16:38:45

@oldProgrammer @thetui

je n'arrive pas a comprendre svp est ce que vous pourriez me donner un exemple de code

14 juin 2018 à 16:42:29

oldProgrammer a écrit:

silent auben a écrit:

thetui a écrit:

Comme te l'a dit oldProgrammer tu as une méthode native qui fait la meme chose, elle est donc a prioritiser.

if nom in list_nom:
  #instruction



ce n'est justement pas une liste de noms mais d'objets.

Sur le principe ça ne change rien... Mais si on va plus loin, conceptuellement, liste_employes n'a rien à faire dans la classe Employe.

Je n'ai pas assez de recul pour dire si c'est une bonne habitude ou pas :p je te crois sur parole :)

Mais si on reste sur le principe de vouloir retirer cette boucle je propose cette solution mais qui te déplaira surement car je reprend le principe de mettre une liste dans la classe pour pouvoir l'appeler ensuite:

class Societe:
 
    def __init__(self, liste_employes):
        self.liste_employes = liste_employes
 
 
    def rechercheNom(self):
        print("Entrez le nom de l'employe:")
        while True:
            nom_employe = input("-> ")
            if nom_employe in Employe.liste_nom:
                print("Le nom existe")
 
 
class Employe:
 
    liste_employes = []
    liste_noms = []
 
    def __init__(self, nom, departement, matricule):
        self.nom = nom
        if nom not in liste_noms:
            liste_noms.append(nom)
        self.departement = departement
        self.matricule = matricule
        Employe.liste_employes.append(self)
 
societe = Societe(Employe.liste_employes)
jean = Employe("jean", "rh", 90)
henri = Employe("henri", "compta", 99)
job = Employe("job", "dsi", 9)



-
Edité par silent auben 14 juin 2018 à 16:44:15

Anonyme
14 juin 2018 à 17:01:33

Voici la mienne

class Societe:
 
    def __init__(self):
        self.liste_employes = []
    def ajouter(self, employe):
        for e in self.liste_employes:
            if e.matricule == employe.matricule:
                return False
        self.liste_employes.append(employe)
        return True
    def rechercher(self, nom):
        emp = []
        for e in self.liste_employes:
            if e.nom == nom:
                print(e)

class Employe:

    def __init__(self, nom, departement, matricule):
        self.nom = nom
        self.departement = departement
        self.matricule = matricule
    def __str__(self):
        return '\n'.join([self.nom,
                          str(self.departement),
                          str(self.matricule)])

societe = Societe()
jean = Employe("jean", "rh", 90)
henri = Employe("henri", "compta", 99)
job = Employe("job", "dsi", 9)
for e in (jean, henri, job):
    added = societe.ajouter(e)
    if not added:
        print('ce matricule existe déjà')

societe.rechercher('henri')

silent auben a écrit:


class Societe:
 
    def __init__(self, liste_employes):
        self.liste_employes = liste_employes
 
 
    def rechercheNom(self):
        print("Entrez le nom de l'employe:")
        while True:
            nom_employe = input("-> ")
            if nom_employe in Employe.liste_nom:
                print("Le nom existe")
 
 
class Employe:
 
    liste_employes = []
    liste_noms = []
 
    def __init__(self, nom, departement, matricule):
        self.nom = nom
        if nom not in liste_noms:
            liste_noms.append(nom)
        self.departement = departement
        self.matricule = matricule
        Employe.liste_employes.append(self)
 
societe = Societe(Employe.liste_employes)
jean = Employe("jean", "rh", 90)
henri = Employe("henri", "compta", 99)
job = Employe("job", "dsi", 9)

Il n'y a pas de bon ou mauvais code, à partir du moment où tu arrives à justifier tes choix. Donc ma question est la suivante,

Pourquoi la liste des employés de la société se trouve dans la classe Employe (qui est censé créer 1 employé) ?

14 juin 2018 à 18:15:49

oldProgrammer a écrit:


Pourquoi la liste des employés de la société se trouve dans la classe Employe (qui est censé créer 1 employé) ?


En fait parce que c'est ce qui est proposé par exemple dans les tutos sur openclassroom, conserver les objets fabriqués par le biais d'un attribut dans la class elle-même, mais encore une fois je n'ai pour ainsi dire aucune légitimité à dire si c'est une bonne habitude ou si il est déconseillé de le faire.

Je prend l'exemple ici : Tuto Objet , l'auteur stock les objets issus de la class Zone dans la class.

Anonyme
14 juin 2018 à 19:31:47

J'avais peur que tu es une autre référence que openclassrooms :p

Ce n'est pas une erreur de conception de penser que L'objet créateur Zone puisse initialiser les autres zones. En fait, c'est pas encore le même problème, dans notre cas, on a une société qui gère ses employés, il semble clair que l'on ne peut pas justifier de la même manière que l'exemple donné en lien.

Pour avoir le même cas, il faudrait avoir une classe Zones gérant la liste des zones créées et dans ce cas l'attribut de classe ZONES ne serait pas justifié non plus. Je ne sais pas si tu me comprends, mais c'est une question de rôle.

-
Edité par Anonyme 14 juin 2018 à 19:41:13

15 juin 2018 à 8:36:14

silent auben a écrit: > En fait parce que c'est ce qui est proposé par exemple dans les tutos sur openclassroom, conserver les objets fabriqués par le biais d'un attribut dans la class elle-même, mais encore une fois je n'ai pour ainsi dire aucune légitimité à dire si c'est une bonne habitude ou si il est déconseillé de le faire.

Et c'est en effet une mauvaise habitude, les cours d'openclassrooms ne font pas foi sur le sujet.

15 juin 2018 à 9:50:14

entwanne a écrit:

silent auben a écrit: > En fait parce que c'est ce qui est proposé par exemple dans les tutos sur openclassroom, conserver les objets fabriqués par le biais d'un attribut dans la class elle-même, mais encore une fois je n'ai pour ainsi dire aucune légitimité à dire si c'est une bonne habitude ou si il est déconseillé de le faire.

Et c'est en effet une mauvaise habitude, les cours d'openclassrooms ne font pas foi sur le sujet.


j'en ai bien conscience, mais tant que je n'ai pas d'avis contraire je ne peux que suivre les prérogatives proposées ici :)

Mais je note vos avis et je tacherai de me renseigner.

15 juin 2018 à 9:56:02

Perso, si j'avais à coder ça, la liste_employes aurait été un attribut de la class Societe, et la class Employe une sous-class dans Societe. Sauf si Employe est utilisé dans autre chose que Societe.

class Societe:

    liste_employes = []

    class Employe:

        pass

    pass



-
Edité par josmiley 15 juin 2018 à 10:01:34

18 juin 2018 à 2:32:31

merci pour vos reponses cela me bien aidé

recherche dans une classe

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown