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 :

Attribut de classe et méthode __init__ [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Par défaut Attribut de classe et méthode __init__
    Bonjour,

    Je tourne, je retourne et... je tourne en rond sur le web. Voilà ma question:
    Je crée le script suivant:
    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
    from enum import Enum
    class MaClasse(Enum):
        vg_1 = 'abcde'
        vg_2 = 3.14
        vg_3 = 'XYZ'
        vg_4 = "{'item1':1,'item2':'TOTO','item3':'C:/Tonton/tata/tutu.f.xyz'}"
        vg_5 = 10
        vg_6 = 'azerty'
        vg_7 = True
     
        def __init__(self):
            self.mvc = "vg_7 = True" if MaClasse.vg_7 else "vg_7 = False"
     
    obj = MaClasse()
    print(1,obj.mvc)
    et j'obtiens l'erreur:
    TypeError: Base.__init__() takes 1 positional argument but 2 were given
    Je soupçonne fort la classe mère (Enum) d'être à l'origine de l'erreur, puisque lorsque je la supprime le script fonctionne, mais ce qui m'intéresse c'est bien de créer une classe dérivée de Enum.
    Quelqu'un a-t-il une piste (doc) ou la solution ?
    Merci d'avance pour votre aide.

    Caplande

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Salut, tu sembles attribuer à enum, un rôle qui n'est pas le sien.

    Extrait de la doc :
    Une Enum est un ensemble de noms symboliques associés à des valeurs uniques. Elles sont similaires aux variables globales, mais elles offrent des particularités utiles telles qu'une meilleure repr(), le regroupement, une sécurité concernant le typage et quelques autres fonctionnalités
    Et également :
    utilise la syntaxe d'appel pour renvoyer les valeurs de ses membres,
    utilise la syntaxe d'indiçage pour renvoyer les noms de ses membres.

    Bref, tu peut utiliser obj = MaClasse(10) ou encore obj = MaClasse["vg_5"].
    Tu ne peux pas écrire obj = MaClasse().

    Quel est l'objectif de cette structure ou tu redéfinit __init__ ?

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Ce que vous soupçonnez est faux, Enum n'est pas à l'origine de l'erreur, c'est la mauvaise lecture de la documentation sur ce module qui provoque l'erreur dans votre code.

    Regardez cette partie de la documentation !

    __new__ est utilisée pour personnaliser la manière dont les membres sont créés et initialisés.

    Pour rentrer dans les détails, je suis pas certains que vous comprendrez cela, car on rentre dans une mécanique que vous ne maîtrisez pas et que vous maîtriserez pas sans doute avant un bon moment.

    La métaclass EnumType modifie le comportement par défaut de la classe Enum pour empêcher l'instanciation d'objets en dehors des membres définis dans la classe Enum.
    En d'autres termes, une fois que les membres de l'énumération sont définis, vous ne pouvez pas créer de nouvelles instances de cette classe en appelant son constructeur.

    Ce fonctionnement permet de garantir que les énumérations agissent comme des ensembles de valeurs constantes et déterminées, plutôt que comme des classes traditionnelles où de nouvelles instances peuvent être créées à volonté.
    Pas sûr que se soit ce comportement que vous cherchiez et il serait plus clair d'expliquer concrètement ce que vous cherchez à faire.

    Si on voulait faire fonctionner votre code, ça ressemblerait à,

    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
    from enum import Enum
     
    class MaClasse(Enum):
        vg_1 = 'abcde'
        vg_2 = 3.14
        vg_3 = 'XYZ'
        vg_4 = "{'item1':1,'item2':'TOTO','item3':'C:/Tonton/tata/tutu.f.xyz'}"
        vg_5 = 10
        vg_6 = 'azerty'
        vg_7 = True
     
        def __new__(cls, value):
            obj = object.__new__(cls)
            obj._value_ = value
            obj.mvc = "vg_7 = True" if value is True else "vg_7 = False"
            return obj
     
     
    print(MaClasse.vg_7.mvc)
    print(MaClasse.vg_1.mvc)
    print(type(MaClasse.vg_1))
    print(type(MaClasse.vg_7.mvc))

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Par défaut
    Merci à vous deux pour ces explications. Je suis arrivé à cette question en cherchant à trouver la solution d'un problème un peu différent et sur lequel je continue de buter. Il est le suivant:
    Peut-on créer dans une classe héritant de Enum un élément calculé dépendant d'un autre élément de la même classe ? Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from enum import Enum
     
    class MaClasse(Enum):
        vg_1 = 'abcde'
        vg_2 = 3.14
        vg_3 = 'XYZ'
        vg_4 = "{'item1':1,'item2':'TOTO','item3':'C:/Tonton/tata/tutu.f.xyz'}"
        vg_5 = 10
        vg_6 = 'azerty'
        vg_7 = False
        vg_8 = MaClasse.vg_7.value
     
    print(1,MaClasse.vg_8.value)
    Donne l'erreur en ligne 11 (vg_8 = MaClasse.vg_7.value):

    NameError: name 'MaClasse' is not defined

    Question d'espace de noms ?

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Citation Envoyé par Caplande Voir le message
    Question d'espace de noms ?
    Je peux écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A:
         u = 123
         v = u
    mais ce n'est pas une histoire d'espace de noms mais de portée des variables/attributs.

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

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Par défaut
    Merci mon pb est résolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/08/2006, 17h48
  2. assignation PHP4 attribut de class
    Par XtofRoland dans le forum Langage
    Réponses: 3
    Dernier message: 08/02/2006, 15h16
  3. Réponses: 3
    Dernier message: 08/12/2005, 14h41
  4. [css]problème d'attribution de classe dans deux listes
    Par Mitaka dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/11/2005, 18h05
  5. Réponses: 9
    Dernier message: 02/09/2005, 15h44

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