St = Student() TypeError: __init__() missing 2 required pos

Résolu
alexander -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis débutant en python. Voici mon code
class Student:
    def __init__(self, name, userid, rep): 
        self.name = name 
        self.userid = userid  
        self.rep =  rep
   
    def describ_std(self)  :    
        name = input("Enter name: ")
        userid = int(input("Enter user id: "))
        rep = int(input("Enter rep: "))

    def typing(self):            
        print(name,userid,rep )

karl = Student.describ_std()

def main():  
    karl.describ_std()
    karl.typing()
    
main()

Lorsque j'exécute :
st = Student()

... j'ai l'erreur :
TypeError: __init__() missing 2 required positional arguments: 'sid' and 'snom'


Comment résoudre cette erreur ?

Merci pour toute aide...

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    La méthode
    __init__
    (appelée parfois constructeur) est appelée lorsque tu appelles
    Student()
    . Comme tu n'as passé aucun argument entre parenthèse, au niveau de la classe,
    self
    est (toujours) renseigné, mais pas
    name
    ,
    userid
    et
    rep
    . Note que ton message d'erreur laisse penser que tu n'as pas réévaluer le code déclarant la classe
    Student
    . Bref, il faudrait par exemple appeler :

    st = Student("My Name", 123, 456)


    ... qui au niveau de
    Student.__init__
    permet de recevoir respectivement:
    • "My Name"
      pour
      name
      ;
    • 123
      pour
      userid
      ;
    • 456
      pour
      rep
      ;


    Les autres appels de méthodes sont de la forme
    student.methode(parametre1, parametre2, ...)
    student
    est une instance de la classe
    Student
    .

    On notera en particulier que l'appel
    karl = Student.describ_std()
    n'est pas cohérent. Ce devrait probablement être une fonction extérieure à la classe
    Student
    ou à la rigueur une méthode de classe ou une méthode statique. En effet, à ce stade, elle ne dépend pas de
    self
    , et en terme de code, elle initialise des variables locales qui ne sont pas retournées. C'est donc comme si elle ne faisait rien.

    D'autres choses ne vont pas. Ta méthode
    typing
    implique des variables locales qui ne sont pas définies (ni paramètres, ni déclarées). Ce que tu veux récupérer, c'est probablement les attributs de l'instance courante
    self
    donc
    self.name
    ,
    self.userid
    , etc.

    Après correction ton code pourrait ressembler à ceci :

    class Student:
        def __init__(self, name, userid, rep): 
            self.name = name 
            self.userid = userid  
            self.rep =  rep
       
        def typing(self):            
            print(self.name, self.userid, self.rep)
    
    def describ_std():
        name = input("Enter name: ")
        userid = int(input("Enter user id: "))
        rep = int(input("Enter rep: "))
        return Student(name, userid, rep)
                            
    def main():
        karl = describ_std()
        karl.typing()
        
    main()
    0