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

  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 720
    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 720
    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 720
    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 720
    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.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 720
    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 720
    Par défaut
    Salut,

    Citation Envoyé par Le Gab Voir le message
    Je viens de trouver une astuce pour contourner le problème et elle fonctionne :
    L'astuce aurait été d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Exemple :
        compteur = 1
     
        def __init__(self, numéro=None):
            self.numéro = numéro or Exemple.compteur
            Exemple.compteur += 1
    Citation Envoyé par Le Gab Voir le message
    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
    Les valeurs par défaut ne sont évaluées qu'une seule fois (à la création de la fonction). Une fonctionnalité qui n'existe pas est difficile à exploiter.


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

  9. #9
    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
    Yes merci Hominidé ! C'est bien le code que je cherchais !
    rah j'y étais presque, mais je viens de comprendre la différence : ma valeur par défaut était l'élément de la liste alors qu'il fallait mettre la liste.


    Wiztricks, en effet ton astuce est plus élégante que la mienne.

    Merci pour cette information !
    Alors, si j'ai bien compris, si on a :
    valeur par défaut = variable, avec variable de type int ou float, l'évaluation n'est faite qu'une seule fois au moment de la définition de la fonction

    Et en revanche, si on a :
    valeur par défaut = variable, avec variable de type list, l'évaluation est faite à chaque appel de la fonction

    (Contredîtes moi si je me trompe).

    Merci beaucoup à tous !

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 720
    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 720
    Par défaut
    Salut,

    Citation Envoyé par Le Gab Voir le message
    Yes merci Hominidé ! C'est bien le code que je cherchais !
    rah j'y étais presque, mais je viens de comprendre la différence : ma valeur par défaut était l'élément de la liste alors qu'il fallait mettre la liste.
    Hominidé a supprimé son message.

    Probablement qu'il a compris que dans ce cas, on se retrouve avec une variable "numéro" à tester pour savoir s'il est liste (par défaut) ou un entier passé par l'utilisateur avant de savoir qu'en faire.
    Un peu lourd quand même.

    Citation Envoyé par Le Gab Voir le message
    Et en revanche, si on a :
    valeur par défaut = variable, avec variable de type list, l'évaluation est faite à chaque appel de la fonction
    L'évaluation (et l'assignation de la valeur par défaut) est faite une seule fois dans les 2 cas. La différence est côté "mutabilité" de l'objet assigné.

    Citation Envoyé par Le Gab Voir le message
    Wiztricks, en effet ton astuce est plus élégante que la mienne.
    Il serait plus sage d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             self.numéro = Exemple.compteur if numéro is None else numéro.
    pour éviter d'avoir des soucis avec 0.

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

  11. #11
    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
    Hominidé, alors en fait, comme l'a souligné wiztricks, ce code posera des soucis si jamais on entre un argument pour numéro (qui sera de type int ou float).
    Du coup l'erreur apparaître au moment où on appelle numéro[0].

    En revanche, ton code a le mérite de marcher si on n'entre pas d'argument et m'a permis d'un peu mieux comprendre le fonctionnement des valeurs par défaut, ce qui marche et ne marche pas. Merci pour ça


    Wiztricks, ouais d'accord je vois ce que tu veux dire du coup pour le code d'Hominidé.

    Ok merci, je vais me renseigner sur cette notion de mutabilité.

    D'accord, j'avais oublié cette manière d'écrire plus efficace.

    Merci pour tout !

  12. #12
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    c'etait une réponse rapide sur une lecture en diagonale
    ... d'ou mon impression d'être hors sujet
    Et oui wiztricks a tout à fait raison.

+ 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