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: faire la différence entre un attribut et une méthode


Sujet :

Python

  1. #1
    Membre chevronné

    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
    Points : 1 751
    Points
    1 751
    Par défaut Classe: faire la différence entre un attribut et une méthode
    Bonjour,
    je voudrais améliorer le code 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # -*- coding: utf-8 -*-
    #!/usr/bin/env python
     
     
    class skeleton():
        def __init__(self, stringFormula):
            self.kindOfObject = 'unknown'
            self.stringFormula = stringFormula
     
            self.alias = stringFormula
            self.arguments = None
            self.isSimplified = False
     
        def dico(self):
            representation = {}
     
            for oneAttribut in dir(self):
                if not oneAttribut.startswith('_'):
                    if oneAttribut != 'dico':
                        representation[oneAttribut] = self.__dict__[oneAttribut]
     
            return representation
     
     
    essai = skeleton('une formule')
    essai.alias ='alias'
    essai.arguments = [4, 'y']
    essai.isSimplified = True
     
    print essai.dico()
    Je voudrais arriver à savoir dirrectement que est une méthode. Est-ce faisable ?

  2. #2
    Membre chevronné

    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
    Points : 1 751
    Points
    1 751
    Par défaut
    En fait, j'avais la solution sous les yeux :
    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
    # -*- coding: utf-8 -*-
    #!/usr/bin/env python
     
     
    class skeleton():
        def __init__(self, stringFormula):
            self.kindOfObject = 'unknown'
            self.stringFormula = stringFormula
     
            self.alias = stringFormula
            self.arguments = None
            self.isSimplified = False
     
        def dico(self):
            representation = {}
     
            for oneAttribut in dir(self):
                if not oneAttribut.startswith('_') and oneAttribut in self.__dict__.keys():
                    representation[oneAttribut] = self.__dict__[oneAttribut]
     
            return representation
     
     
    essai = skeleton('une formule')
    essai.alias ='alias'
    essai.arguments = [4, 'y']
    essai.isSimplified = True
     
    print essai.dico()

  3. #3
    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
    Je n'ai rien compris à ta question, d'ailleurs je ne vois même pas où est ton souci.
    Toutefois, pour savoir si quelque chose peut être appelé comme une fonction, il y a callable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> class MyObject:
    ...     def method(self):
    ...         pass
    ...
    >>> m = MyObject()
    >>> callable(m.method)
    True

  4. #4
    Membre chevronné

    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
    Points : 1 751
    Points
    1 751
    Par défaut
    En fait, pour travailler avec des formules de maths, je les parse et j'en retire une structure à l'aide de classes. Mais voilà que pickle ne veut pas de mes classes. Du coup je voudrais modifier à peine mes classes pour qu'elle renvoie un dico. Du coup j'ai juste besoin des attributs de la classe qui ne sont pas des fonctions, ces dernières étant juste utilisées pour obtenir la structure de la formule.

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 911
    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 : 3 911
    Points : 7 294
    Points
    7 294
    Par défaut
    Il me semble si mes souvenirs sont bons, que l'on peut accéder aux attributs d'une classe soit par la classe elle-même, soit par l'instance de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class test(object):
        constante=2
    Accès via la classe :

    Accès via l'instance :

    Pour une mise à jour de la constante, on ne peut que par la classe, me semble-t-il :


  6. #6
    Membre chevronné

    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
    Points : 1 751
    Points
    1 751
    Par défaut
    Le souci n'est pas là car en fait je ne connais pas a priori tous les noms des attributs, et surtout je veux pouvoir les changer. Du coup je suis arrivé à la méthode suivante, sous Python 3, qui dans mon cas va totalement me convenir :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #!/usr/bin/env python
     
    import inspect
     
    class skeleton():
        def __init__(self, stringFormula):
            self.kindOfObject = 'unknown'
            self.stringFormula = stringFormula
     
            self.alias = stringFormula
            self.arguments = None
            self.isSimplified = False
     
    def dico(oneClassInstance):
        """
        This function is used so as to have a dictionnary like representation of mathIdentity.
        """
        if not isinstance(oneClassInstance, skeleton):
            raise ValueError("You haven't given a skeleton.")
     
        representation = {}
     
        for oneAttribut in dir(oneClassInstance):
            if not oneAttribut.startswith('_') and oneAttribut in oneClassInstance.__dict__.keys():
                representation[oneAttribut] = __onePiece2Dico__(oneClassInstance.__dict__[oneAttribut])
     
        return representation
    def __onePiece2Dico__(onePiece):
        if isinstance(onePiece, skeleton):
            return dico(onePiece)
     
        if isinstance(onePiece, list):
            return [__onePiece2Dico__(x) for x in onePiece]
     
        if type(onePiece).__name__ == "function":
    # Source : http://www.developpez.net/forums/d788159/autres-langages/python-zope/general-python/recuperer-formule-lambda-fonction/
            formula = inspect.getsource(onePiece).split('lambda')[1:]
            formula = ' '.join(formula)
            return formula.strip()
     
        return onePiece
     
     
    #!/usr/bin/env python
     
    import inspect
     
    class skeleton():
        def __init__(self, stringFormula):
            self.kindOfObject = 'unknown'
            self.stringFormula = stringFormula
     
            self.alias = stringFormula
            self.arguments = None
            self.isSimplified = False
     
    def dico(oneClassInstance):
        """
        This function is used so as to have a dictionnary like representation of mathIdentity.
        """
        if not isinstance(oneClassInstance, skeleton):
            raise ValueError("You haven't given a skeleton.")
     
        representation = {}
     
        for oneAttribut in dir(oneClassInstance):
            if not oneAttribut.startswith('_') and oneAttribut in oneClassInstance.__dict__.keys():
                representation[oneAttribut] = __onePiece2Dico__(oneClassInstance.__dict__[oneAttribut])
     
        return representation
    def __onePiece2Dico__(onePiece):
        if isinstance(onePiece, skeleton):
            return dico(onePiece)
     
        if isinstance(onePiece, list):
            return [__onePiece2Dico__(x) for x in onePiece]
     
        if type(onePiece).__name__ == "function":
    # Source : http://www.developpez.net/forums/d788159/autres-langages/python-zope/general-python/recuperer-formule-lambda-fonction/
            formula = inspect.getsource(onePiece).split('lambda')[1:]
            formula = ' '.join(formula)
            return formula.strip()
     
        return onePiece
     
     
    # TEST
    alias = skeleton('alias')
    essai = skeleton('une formule')
    essai.alias = alias
    essai.arguments = lambda x:x+4
    essai.isSimplified = True
     
    exec("""print('dic({0})')
    print(dico({0}))""".format('essai'))
    Ceci renvoie :
    {'alias': { 'alias': 'alias',
    'isSimplified': False,
    'kindOfObject': 'unknown',
    'arguments': None,
    'stringFormula': 'alias'},
    'isSimplified': True,
    'kindOfObject': 'unknown',
    'arguments': 'x+4',
    'stringFormula': 'une formule'}

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2008, 09h29
  2. Faire la différence entre texte et photos sur une image
    Par NiuAge dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 23/02/2007, 23h45
  3. Sérialisation: Quelles différences entre les attributs ?
    Par eldoctor.Sylvain dans le forum Framework .NET
    Réponses: 2
    Dernier message: 18/09/2006, 15h12
  4. Réponses: 7
    Dernier message: 05/07/2006, 16h29
  5. Réponses: 11
    Dernier message: 31/01/2005, 17h48

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