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 :

Classe-Définir un attribut via une chaîne


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Classe-Définir un attribut via une chaîne
    Bonjour.

    Soit le code suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class bidon()
       def __init__(self):
           ...
    Je voudrais ajouter l'attribut bidon.test en utilisant la chaîne "test". Ceci me permettrait d'ajouter des attributs et leurs valeurs définies à partir d'un dictionnaire.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    c'est pour ajouter un attribut d'instance ou un attribut de classe ?

    pour la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bidon.__dict__[chaine] = valeur
    pour l'instance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = bidon()
    b.__dict__[chaine] = valeur
    ou alors danxs l'init de la classe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self):
        self.__dict__[chaine] = value
    ou encore, la même chose mais en utilisant setattr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    setattr(bidon,chaine,value)
    setattr(b,chaine,value)
    setattr(self,chaine,value)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut
    J'ai peut être pas tout compris mais 'Folder' ci dessous fait un peu cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Folder(dict):
        def __init__(self, **kwds):
            super(Folder, self).__init__(kwds)
            self.__dict__ = self
     
    if __name__ == '__main__':
        c = Folder(a=1, b='abc')
        print 'c= ', c
        print 'c.a =', c.a
        print 'c.b =', c.b
        c.c = '123'
        print 'c = ',c
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Peut-être suis-je à côté de la question, mais tant pis:

    Python accepte qu'on crée un nouvel attribut de classe 'à la volée', et pourquoi pas, un attribut qui soit un dictionnaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Truc(object):
        pass
     
    a = Truc()
    a.test = {}
    a.test['x'] = 123456
    print a.test['x']
    123456
    J'avoue que cette facilité m'a toujours un peu choqué. Mais bon. Pour une fois que c'est utile...

    Tyrtamos

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    J'avoue que cette facilité m'a toujours un peu choqué.
    moi de même. mais j'avoue avoir lu un article sur le data driven programming dans le dernier HS Linux Mag sur Python qui m'a presque convaincu

    (je n'ai pas le mag sous les yeux, je ne me souviens plus du nom de l'auteur)

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

    Citation Envoyé par tyrtamos Voir le message
    Python accepte qu'on crée un nouvel attribut de classe 'à la volée', et pourquoi pas, un attribut qui soit un dictionnaire
    Dans le cas particulier, il s'agit d'un attribut d'instance et non de classe: mais on peut les créer aussi 'à la volée' ou via setattr si on doit transformer une chaine de caractères en noms de variable.

    J'avoue que cette facilité m'a toujours un peu choqué. Mais bon. Pour une fois que c'est utile...
    Heu?!? C'est quand même ce qui contribue au "dynamique" du langage.
    On peut même ajouter ou remplacer des méthodes... Ce qui peut être bien sympa lorsqu'on teste.
    Note: __slots__ permet de restreindre quelque peu les ajouts de variables
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Heu?!? C'est quand même ce qui contribue au "dynamique" du langage.
    Mais le basic avait aussi cette souplesse-là: une faute de frappe et hop: une nouvelle variable est crée sans rien dire... Désolé, je supporte, mais je ne mets pas ça dans les qualités...

    Pour ma défense, j'ai beaucoup travaillé en Pascal: j'ai donc été élevé "à la dure", et il doit m'en rester quelques séquelles. .

    Tyrtamos

  8. #8
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci pour ces réponses.

    Ce que je cherchais est dans ce code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = bidon()
    b.__dict__[chaine] = valeur
    Pour rebondir sur le dynamisme de Python, il est parfois dangereux. Il y a a peu j'ai testé des snippets pour pyenchant. Et hop, je me retrouve avec ce que je crois être un gros bug. Je décide de réfléchir au problème, et un peu fatigué je me passe la tête sous l'eau. Et là, révélation, le bug est sous mes yeux dans le mirroir : c'était moi qui avais nommé un fichier tokenize.py alors que pyenchant utilise un module nommé tokenize.
    Un petit message pour me dire "Attention, vous avez redéfini tokenize." serait bienvenu. Non ?

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

Discussions similaires

  1. Définir l'encodage d'une chaîne
    Par Adorien dans le forum Langage
    Réponses: 2
    Dernier message: 12/04/2010, 12h22
  2. Lancer une procédure via une chaîne de caractère
    Par rstephane dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 02/06/2009, 17h11
  3. [RegEx] Changer la valeur d’un attribut dans une chaîne
    Par sara21 dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2008, 19h31
  4. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  5. Réponses: 4
    Dernier message: 28/03/2007, 22h23

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