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 :

Utilisation des attributs de classe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Par défaut Utilisation des attributs de classe
    Bonjour,
    Je ne maîtrise visiblement pas pas bien l'utilisation des attributs de classe.
    Je souhaite crée une classe, dont les instances seront automatiquement numérotés. (une instance aura un attribut numéro)
    Mais je souhaite qu'on puisse aussi attribuer un numéro arbitraire à une instance.

    Voila ce que j'avais fait :
    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
     
    class Exemple :
         compteur = 1
         def __init__(self, numéro= compteur):
              self.numéro = numéro
              Exemple.compteur += 1
         def getnum(self) :
              print(self.numéro)
     
     
     
     
    for i in range(4) : 
         L = [0,0,0,0]
         print(Exemple.compteur)
         L[i] = Exemple()
         L[i].getnum()
    compteur s'incrémente bien mais les attributs numéros restent à 1. Je ne comprends pas pourquoi.

    Question supplémentaire : je ne comprends pas trop non plus comment faire appel à un attribut de classe dans la classe et en dehors de la classe :
    classe.attribut semble marcher à l'intérieur et à l'extérieur d'une classe
    self.__class__.attribut marche dans la classe, (je me demande du coup à quoi sert cette notation)
    attribut tout court ne semble marcher nulle part...
    c'est bien ça ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 707
    Par défaut
    Salut,

    Citation Envoyé par Le Gab Voir le message
    Je ne comprends pas pourquoi.
    La question est de savoir d'où sortent les valeurs par défaut d'une fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> a = 1
    >>> def f(x=a):
    ...     print(x)
    ...
    >>> f()
    1
    >>> a = 2
    >>> f()
    1
    >>>
    Comme l'objet associé à a n'est pas mutable, x=a fabrique une référence à 1.
    Changez a, vous ne changez pas x.

    Si on met un mutable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> f()
    [1, 2, 3]
    >>> a[:] = ['a', 'b']
    >>> f()
    ['a', 'b']
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2020
    Messages : 20
    Par défaut
    compteur s'incrémente bien mais les attributs numéros restent à 1. Je ne comprends pas pourquoi.
    pourquoi il augmenterait si tu ne lui demande pas de le faire ?

    j'a fait ça dans un prog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class variable:
        """ classe definissant blablabla
     
            """
        nb_variable = 0
        def __init__(self):
            variable.nb_variable += 1 # compte le nb de variable cree
     
            self.valeur = 0
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
     
    coucou2 = variable ()
    coucou2.valeur += 2

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2020
    Messages : 20
    Par défaut
    je viens de mieux comprendre ce que tu veux !
    tu attribut 1 à compteur et compteur à numero (évite les accents) donc numero est à 1

    il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Exemple :
         compteur = 1
         def __init__(self):
     
              Exemple.compteur += 1
              self.numéro = Exemple.compteur
    et tu le modifie comme j'ai dit avant si tu le veux

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 707
    Par défaut
    Citation Envoyé par fraborak Voir le message
    pourquoi il augmenterait si tu ne lui demande pas de le faire ?
    Le PO fait exactement ce que vous proposez mais à d'autres problèmes.
    A quoi bon répondre à des questions si vous ne prenez pas le temps de comprendre le problème?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Par défaut
    Merci fraborak d'avoir pris le temps de me répondre ! En effet votre solution fonctionne mais elle ne répond pas exactement au problème que j'ai.
    Je voudrais que par défaut, le programme numérote les instances créées en partant de 1. (Là-dessus votre code est ok.)
    Mais je voudrais en plus pouvoir choisir le numéro d'une instance au moment de sa création. Par exemple, je voudrais pouvoir attribuer à la 5ème instance le numéro 100.
    Et votre code ne le permet pas.


    Merci Wiztricks pour ta réponse ! Ce fonctionnement me surprend, en associant la valeur par défaut à une variable, je voulais justement associer un objet mutable...

    Alors du coup pour résoudre mon problème suite à votre explication, j'ai essayé une astuce à 2 balles pour laquelle j'avais peu d'espoirs : créer une variable tampon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Exemple :
        compteur = 1
        c = compteur  # j'asssocie une variable, (un objet mutable?) à la valeur par défaut
     
        def __init__(self, numéro= c):
            self.numéro = numéro
            Exemple.compteur += 1
    Bon du coup ça n'a pas marché, j'imagine que le problème reste le même.
    L'attribut numéro reste à 1 après plusieurs itérations alors que la variable compteur s'incrémente correctement.

    J'ai aussi essayer d'utiliser un objet muable, une liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Exemple :
        compteur = [1]
     
        def __init__(self, numéro= compteur[0]):
            self.numéro = numéro
            Exemple.compteur[0] += 1
    Mais ça n'a pas marché non plus (même situation que précédemment).


    Je ne parviens toujours pas à résoudre mon problème, je ne suis pas contre une petite aide supplémentaire.
    Désolé de vous prendre du temps.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Par défaut
    Je viens de trouver une astuce pour contourner le problème et elle fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Exemple :
        compteur = 1
     
        def __init__(self, numéro= None):
     
            if numéro != None :
                self.numéro = numéro
            else :
                self.numéro = Exemple.compteur
            Exemple.compteur += 1
    Je suis content mais je n'ai toujours pas compris le problème que j'avais tout à l'heure. Je trouve ça dommage de ne pas savoir correctement exploiter la fonctionnalité des valeurs par défauts, donc je suis toujours preneur d'une solution.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2011, 16h04
  2. Utiliser des attributs de classe
    Par cladjules dans le forum Services Web
    Réponses: 1
    Dernier message: 03/07/2009, 13h55
  3. Problème d'utilisation des attributs width et height avec une image distante
    Par Ptit_Mouss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/09/2006, 15h40
  4. Réponses: 2
    Dernier message: 24/08/2006, 17h48
  5. Réponses: 1
    Dernier message: 09/03/2006, 18h15

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