245 votes

Itération sur les attributs des objets en python

J'ai un objet python avec plusieurs attributs et méthodes. Je veux itérer sur les attributs de l'objet.

class my_python_obj(object):
    attr1='a'
    attr2='b'
    attr3='c'

    def method1(self, etc, etc):
        #Statements

Je veux générer un dictionnaire contenant tous les attributs des objets et leurs valeurs actuelles, mais je veux le faire de manière dynamique (ainsi, si plus tard j'ajoute un autre attribut, je ne dois pas me souvenir de mettre à jour ma fonction également).

En php, les variables peuvent être utilisées comme clés, mais les objets en python sont insuscriptibles et si j'utilise la notation par points pour cela, cela crée un nouvel attribut avec le nom de ma var, ce qui n'est pas mon intention.

Pour que les choses soient plus claires :

def to_dict(self):
    '''this is what I already have'''
    d={}
    d["attr1"]= self.attr1
    d["attr2"]= self.attr2
    d["attr3"]= self.attr3
    return d

-

def to_dict(self):
    '''this is what I want to do'''
    d={}
    for v in my_python_obj.attributes:
        d[v] = self.v
    return d

Mise à jour : Avec les attributs, je veux dire seulement les variables de cet objet, pas les méthodes.

0voto

Julian Points 2499

La réponse correcte à cette question est que vous ne devriez pas. Si vous voulez ce genre de choses, utilisez un dict ou ajoutez explicitement des attributs à un conteneur. Vous pouvez automatiser cela en vous familiarisant avec les décorateurs.

En particulier, d'ailleurs, la méthode1 dans votre exemple est un attribut tout aussi bon.

0voto

Rubber Duck Points 380

Pour python 3.6

class SomeClass:

    def attr_list(self, should_print=False):

        items = self.__dict__.items()
        if should_print:
            [print(f"attribute: {k}    value: {v}") for k, v in items]

        return items

-5voto

Rubber Duck Points 380

Pour tous les zélateurs pythoniens, je suis sûr que Johan Cleeze approuverait votre dogmatisme ;). Je laisse cette réponse continuer à démériter Cela me rend en fait plus confiant. Laissez un commentaire les poules mouillées !

Pour python 3.6

class SomeClass:

    def attr_list1(self, should_print=False):

        for k in self.__dict__.keys():
            v = self.__dict__.__getitem__(k)
            if should_print:
                print(f"attr: {k}    value: {v}")

    def attr_list(self, should_print=False):

        b = [(k, v) for k, v in self.__dict__.items()]
        if should_print:
            [print(f"attr: {a[0]}    value: {a[1]}") for a in b]
        return b

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X