493 votes

Liste des attributs d'un objet

Existe-t-il un moyen d'obtenir une liste d'attributs existant sur les instances d'une classe ?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))

Le résultat souhaité est que "multi, str" soit affiché. Je veux que cela permette de voir les attributs actuels de différentes parties d'un script.

93 votes

Pratiquement tous les utilisateurs de Python nomment leurs classes de la manière suivante NewClass . Vous pouvez défier les attentes des gens en utilisant une convention de dénomination telle que new_class .

1 votes

Même s'il est interactif et ne peut pas être utilisé par des programmes, help() des aides fonctionnelles pour obtenir des informations sur les classes, les fonctions, les composants, les modules, etc.

2 votes

37voto

SilentGhost Points 79627
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

Bien entendu, toutes les méthodes et tous les attributs de la définition de la classe seront imprimés. Vous pouvez exclure les méthodes "privées" en modifiant le paramètre i.startwith('__') a i.startwith('_')

17voto

Jason Angel Points 558

Vous pouvez utiliser dir(your_object) pour obtenir les attributs et getattr(your_object, your_object_attr) pour obtenir les valeurs

utilisation :

for att in dir(your_object):
    print (att, getattr(your_object,att))

Ceci est particulièrement utile si votre objet n'a pas de __dict__. Si ce n'est pas le cas, vous pouvez essayer var(votre_objet) également

11voto

mike Points 3565

Il est souvent mentionné que pour dresser une liste complète d'attributs, il faut utiliser dir() . Il convient toutefois de noter que, contrairement à la croyance populaire dir() ne fait pas ressortir tous attributs. Par exemple, vous pouvez remarquer que __name__ peut manquer dans la base de données de la classe. dir() même si vous pouvez y accéder à partir de la classe elle-même. D'après la documentation sur dir() ( Python 2 , Python 3 ):

Étant donné que dir() est fourni principalement pour faciliter l'utilisation d'un interactive, elle essaie de fournir un ensemble intéressant de noms plus qu'elle n'essaie de fournir un ensemble de noms rigoureusement ou de noms, et son comportement détaillé peut changer d'une version à l'autre. Par exemple, les attributs des métaclasses ne sont pas par exemple, les attributs de métaclasse ne figurent pas dans la liste des résultats lorsque l'argument est une classe. est une classe.

Une fonction comme la suivante tend à être plus complète, bien qu'il n'y ait aucune garantie d'exhaustivité puisque la liste renvoyée par la fonction dir() peut être affectée par de nombreux facteurs, notamment la mise en œuvre de la __dir__() ou en personnalisant la méthode __getattr__() o __getattribute__() sur la classe ou l'un de ses parents. Voir les liens fournis pour plus de détails.

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)

10voto

user1928764 Points 29

Il y a plus d'une façon de procéder :

#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )

Lorsqu'il est exécuté, ce code produit

jeffs@jeff-desktop:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

jeffs@jeff-desktop:~/skyset$

8voto

Mike Graham Points 22480

Pourquoi voulez-vous cela ? Il peut être difficile de vous donner la meilleure réponse si vous ne connaissez pas votre intention exacte.

  • Il est presque toujours préférable de le faire manuellement si vous souhaitez afficher une instance de votre classe d'une manière spécifique. Cela permettra d'inclure exactement ce que vous voulez et de ne pas inclure ce que vous ne voulez pas, et l'ordre sera prévisible.

    Si vous cherchez un moyen d'afficher le contenu d'une classe, formatez manuellement les attributs qui vous intéressent et fournissez-les en tant qu'attribut __str__ o __repr__ pour votre classe.

  • Si vous voulez savoir quelles sont les méthodes et autres qui existent pour un objet afin de comprendre comment il fonctionne, utilisez help . help(a) affichera une sortie formatée sur la classe de l'objet en se basant sur sa docstrings.

  • dir existe pour obtenir par programme tous les attributs d'un objet. (L'accès aux __dict__ fait quelque chose que je considérerais comme identique mais que je n'utiliserais pas moi-même). Cependant, cela peut ne pas inclure des choses que vous voulez et peut inclure des choses que vous ne voulez pas. Il n'est pas fiable et les gens pensent qu'ils le veulent beaucoup plus souvent qu'ils ne le veulent.

  • Sur une note quelque peu orthogonale, il y a très peu de support pour Python 3 à l'heure actuelle. Si vous souhaitez écrire de vrais logiciels, vous aurez besoin d'outils tiers comme numpy, lxml, Twisted, PIL, ou tout autre framework web qui ne supporte pas encore Python 3 et ne prévoit pas de le faire de sitôt. Les différences entre la version 2.6 et la branche 3.x sont minimes, mais la différence dans le support des bibliothèques est énorme.

4 votes

Je voudrais juste souligner que cinq ans plus tard (maintenant), je crois que tous les modules tiers que vous mentionnez supportent python3. Source : python3wos.appspot.com

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