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

435voto

>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])

Vous pouvez également trouver pprint utiles.

226voto

mkotechno Points 1480
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

Vous pouvez ensuite tester ce type avec type() ou s'il s'agit d'une méthode avec callable() .

0 votes

Dir fonctionnait mieux sur les classes avec des attributs surchargés get/set

1 votes

Dir(instance) liste un grand nombre de choses qui ne vous intéressent probablement pas

0 votes

C'est la seule fonction qui m'a permis d'obtenir tous les attributs disponibles sur le fichier boston jeu de données de sklearn - __dict__ était vide, alors qu'il y avait en fait 5 attributs disponibles

154voto

CPU 100 Points 2269

Toutes les réponses précédentes sont correctes, vous avez trois possibilités pour répondre à votre question

  1. dir()

  2. vars()

  3. __dict__

    dir(a) ['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'multi', 'str'] vars(a) {'multi': 4, 'str': '2'} a.dict {'multi': 4, 'str': '2'}

94voto

rohithpr Points 2383

vars(obj) renvoie les attributs d'un objet.

41voto

Fermi paradox Points 2930

Inspecter le module :

Le module d'inspection fournit plusieurs fonctions utiles pour aider à obtenir les informations suivantes informations sur les objets vivants tels que les modules, les classes, les méthodes, les fonctions, les tracebacks, les objets de type frame et les objets de type code.


Utilisation getmembers() vous pouvez voir tous les attributs de votre classe, ainsi que leur valeur. Pour exclure les attributs privés ou protégés, utilisez .startswith('_') . Pour exclure des méthodes ou des fonctions, utilisez inspect.ismethod() o inspect.isfunction() .

import inspect

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

    def func_1(self):
        pass

inst = NewClass(2)

for i in inspect.getmembers(inst):
    # Ignores anything starting with underscore 
    # (that is, private and protected attributes)
    if not i[0].startswith('_'):
        # Ignores methods
        if not inspect.ismethod(i[1]):
            print(i)

Il convient de noter que ismethod() est utilisé sur le deuxième élément de i puisque le premier est simplement une chaîne de caractères (son nom).

Hors sujet : Utilisation <a href="https://www.python.org/dev/peps/pep-0008/#class-names" rel="nofollow noreferrer">CamelCase </a>pour les noms de classe.

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