IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

POO : TypeError et arguments


Sujet :

Python

  1. #1
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut POO : TypeError et arguments
    Bonsoir, j'ai un petit problème, non pas pour le langage Python en lui-même, mais plutôt pour la notion de POO que je commence peu à peu à assimiler depuis aujourd'hui.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
     
    class Roulette :
     
        def __init__(self, nb):
            pass
     
        def color(self, nb):
            if nb == 0:
                self.color = "green"
            elif nb == 2 or nb == 4 or nb == 6 or nb == 8 or nb == 10 or nb == 11 or nb == 13 or nb == 15 or nb == 17 or nb == 20 or nb == 22 or nb == 24 or nb == 26 or nb == 28 or nb == 29 or nb == 31 or nb == 33 or nb == 35 :
                self.color = "black"
            else :
                self.color = "red"
     
            return self.color
            pass
     
        def parity(self, nb):
            if nb % 2 == 0:
                self.parity = True
            else:
                self.parity = False
     
            return self.parity
            pass
     
        pass
     
    chance = Roulette(36)
    print(chance.color())
    print (chance.parity())
    Je m'attends là à voir : "red True" mais j'ai ceci à la place :
    TypeError: color() takes exactly 2 arguments (1 given)
    J'envoie pourtant l'argument avec "Roulette(36)", non ?


    Merci d'avance pour votre aide !

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Hello,

    Si tu appelles chance.color() et chance.parity() sans argument, alors seul 'self' est passé à la méthode.

    Le meilleur moyen de faire ce que tu souhaites est de mettre 'nb' en membre donnée de la classe c-a-d 'self.nb'. Comme ça toutes les méthodes de la classe ont accès à self.nb, argument passé à l'instanciation de la classe.

    Le paramètre passé à l'instanciation de la classe (c-a-d 'nb') est assigné à self.nb. Ensuite les méthodes de la classe travaille sur le membre donnée self.nb et non sur un paramètre.

    J'ai aussi enlevé les 'pass' qui ne servent à rien.

    Plutôt que de faire un super gros test sur toutes les possibilités numériques de 'black', j'ai créé un tuple (self.black_nb) et je fais un simple test pour savoir si le membre self.nb est dans le tuple via 'elif self.nb in self.black_nb':

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
     
    class Roulette :    
        def __init__(self, nb):
            self.nb = nb
            self.black_nb = (2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35)
     
        def color(self):
            if self.nb == 0:
                self.color = "green"
            elif self.nb in self.black_nb:
                self.color = "black"
            else :
                self.color = "red"
     
            return self.color
     
        def parity(self):
            if self.nb % 2 == 0:
                self.parity = True
            else:
                self.parity = False
     
            return self.parity
     
    if __name__ == "__main__":
        chance = Roulette(36)
        print(chance.color())
        print (chance.parity())

    N'hésites pas si tu as des questions.

  3. #3
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    merci de ta réponse, cela m'a beaucoup aidé, et mon bout de code fonctionne enfin. Et aussi, merci pour l'astuce du tuple, c'est vrai que le gros test faisait assez crade sur le code !

    Cependant, je ne l'ai pas mis dans mon code actuel, mais je ne comprends pas l'intérêt de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if __name__ == "__main__":
    À quoi cela sert-il ?

    Merci.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par golden boy Voir le message
    Cependant, je ne l'ai pas mis dans mon code actuel, mais je ne comprends pas l'intérêt de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if __name__ == "__main__":
    À quoi cela sert-il ?
    Cela indique que le module qui contient cette ligne est le module principal.

    c.f: http://docs.python.org/library/__main__.html

    http://diveintopython.adrahon.org/ge...g_modules.html

    Évidemment quand on ne dispose que d'un seul module - comme c'est le cas ici - l'intérêt est inexistant, mais je crois que c'est déjà une bonne pratique de programmation, notamment pour la suite lorsque tu fera des programmes plus consistants (avec plusieurs modules).

  5. #5
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut
    Ah d'accord, et bien j'y penserai pour mes futurs gros projets (j'espère), merci à toi !

  6. #6
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Et que se passe-t-il si on appelle deux fois la méthode "color" sur le même objet ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] passer une méthode en argument
    Par gorgonite dans le forum Langage
    Réponses: 4
    Dernier message: 09/11/2007, 18h56
  2. [POO] Objet en argument de fonction
    Par lunab54 dans le forum Langage
    Réponses: 12
    Dernier message: 12/02/2007, 23h32
  3. [POO] Argument facultatif par référence
    Par windob dans le forum Langage
    Réponses: 11
    Dernier message: 20/08/2006, 15h02
  4. [POO] Trouver le type d'un objet passé en argument
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/02/2006, 15h08
  5. [POO] Passer un objet HTML en argument.
    Par defacta dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2004, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo