Existe-t-il un moyen de récupérer une liste d'attributs qui existent 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" sera émis. Je veux que cela voit les attributs actuels de diverses parties d'un script.
python
class
python-3.x
MadSc13ntist
la source
la source
NewClass
. Vous pouvez défier les attentes des gens si vous utilisez une convention de dénomination commenew_class
.help()
fonction aide à obtenir des informations sur les classes, les fonctions, les modules internes, les modules, etc.Réponses:
Vous pouvez également trouver pprint utile.
la source
pprint.pprint(a.__dict__)
fait une jolie impression sur les attributs.pprint
ne fonctionne PAS sur Python 2.6.Ensuite, vous pouvez tester avec quel type est
type()
ou si est une méthode aveccallable()
.la source
boston
ensemble de données de sklearn -__dict__
était vide, alors qu'en fait il y avait 5 attributs disponiblesvars(obj)
renvoie les attributs d'un objet.la source
Toutes les réponses précédentes sont correctes, vous avez trois options pour ce que vous demandez
dir()
vars()
__dict__
la source
vars(foo)
retoursfoo.__dict__
Bien sûr, cela imprimera toutes les méthodes ou attributs de la définition de classe. Vous pouvez exclure les méthodes « privées » en changeant
i.startwith('__')
dei.startwith('_')
la source
Le module d' inspection fournit des moyens simples d'inspecter un objet:
En utilisant,
getmembers()
vous pouvez voir tous les attributs de votre classe, ainsi que leur valeur. Pour exclure des attributs privés ou protégés, utilisez.startswith('_')
. Pour exclure des méthodes ou des fonctions, utilisezinspect.ismethod()
ouinspect.isfunction()
.Notez qu'il
ismethod()
est utilisé sur le deuxième élément dei
puisque le premier est simplement une chaîne (son nom).Hors sujet : utilisez CamelCase pour les noms de classe.
la source
Vous pouvez utiliser
dir(your_object)
pour obtenir les attributs etgetattr(your_object, your_object_attr)
obtenir les valeursutilisation:
Ceci est particulièrement utile si votre objet n'a pas de __dict__. Si ce n'est pas le cas, vous pouvez également essayer var (your_object)
la source
Il est souvent mentionné que pour répertorier une liste complète des attributs que vous devez utiliser
dir()
. Notez cependant que contrairement à la croyance populairedir()
ne fait pas ressortir tous les attributs. Par exemple, vous remarquerez__name__
peut-être qu'il manque dans ladir()
liste d'une classe même si vous pouvez y accéder depuis la classe elle-même. Depuis la docdir()
( Python 2 , Python 3 ):Une fonction comme la suivante a tendance à être plus complète, bien qu'il n'y ait aucune garantie d'exhaustivité, car la liste renvoyée par
dir()
peut être affectée par de nombreux facteurs, notamment la mise en œuvre de la__dir__()
méthode, la personnalisation__getattr__()
ou__getattribute__()
la classe ou l'un de ses parents. Voir les liens fournis pour plus de détails.la source
Pourquoi voulez-vous cela? Il peut être difficile de vous obtenir la meilleure réponse sans connaître 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 comprendra exactement ce que vous voulez et non ce que vous ne voulez pas, et la commande 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-le comme méthode
__str__
ou__repr__
pour votre classe.Si vous voulez en savoir plus sur les méthodes et celles qui existent pour qu'un objet comprenne comment il fonctionne, utilisez
help
.help(a)
vous montrera une sortie formatée sur la classe de l'objet en fonction de ses docstrings.dir
existe pour obtenir par programmation tous les attributs d'un objet. (L'accès__dict__
fait quelque chose que je regrouperais de la même façon mais que je ne me servirais pas moi-même.) Cependant, cela peut ne pas inclure les choses que vous voulez et cela peut inclure des choses que vous ne voulez pas. Ce n'est pas fiable et les gens pensent qu'ils le veulent beaucoup plus souvent qu'eux.Sur une note quelque peu orthogonale, il y a très peu de support pour Python 3 à l'heure actuelle. Si vous êtes intéressé par l'écriture de vrais logiciels, vous allez vouloir des trucs tiers comme numpy, lxml, Twisted, PIL, ou un certain nombre de frameworks Web qui ne prennent pas encore en charge Python 3 et ne prévoient pas trop tôt. Les différences entre 2.6 et la branche 3.x sont petites, mais la différence dans le support de bibliothèque est énorme.
la source
Il y a plus d'une façon de le faire:
Lorsqu'il est exécuté, ce code produit:
la source
Veuillez voir le script shell python qui a été exécuté en séquence, ici vous obtiendrez les attributs d'une classe au format chaîne séparés par des virgules.
J'utilise python 3.4
la source
a.__dict__.keys()
. Cependant, si vous voulez savoir si un objet a un attribut spécifique, vous pouvez l'utiliserhasattr
.En plus de ces réponses, j'inclurai une fonction (python 3) pour cracher pratiquement toute la structure de n'importe quelle valeur. Il utilise
dir
pour établir la liste complète des noms de propriété, puis utilisegetattr
avec chaque nom. Il affiche le type de chaque membre de la valeur et, si possible, affiche également le membre entier:Maintenant, l'un des éléments suivants devrait donner un aperçu:
la source
Récupère les attributs d'un objet
Production
la source
Comme écrit avant, l'utilisation
obj.__dict__
peut gérer les cas courants, mais certaines classes n'ont pas l'__dict__
attribut et l'utilisation__slots__
(principalement pour l'efficacité de la mémoire).exemple pour une façon plus résiliente de le faire:
la sortie de ce code:
Remarque 1:
Python est un langage dynamique et il est toujours préférable de connaître les classes dont vous essayez d'obtenir les attributs car même ce code peut manquer certains cas.
Remarque 2:
ce code ne produit que des variables d'instance, ce qui signifie que les variables de classe ne sont pas fournies. par exemple:
sorties de code:
Ce code n'imprime pas l'
url
attribut de classe et peut omettre les attributs de classe souhaités.Parfois, nous pouvons penser qu'un attribut est un membre d'instance, mais il n'est pas et ne sera pas affiché à l'aide de cet exemple.
la source
__dict__
et__slots__
, donc vous voudrez probablement essayer les deux plutôt que juste le dict.__dict__
ouvars
ne fonctionne pas car il manque__slots__
.__dict__
et__slots__
ne fonctionne pas car il manque les__slots__
classes de base.dir
ne fonctionne pas car elle inclut des attributs de classe, tels que des méthodes ou des propriétés, ainsi que les attributs d'objet.vars
équivaut à utiliser__dict__
.C'est le meilleur que j'ai:
la source
la source
Veuillez voir l'exécution des scripts de shell Python suivante dans l'ordre, cela donnera la solution de la création de classe à l'extraction des noms de champ des instances.
la source
__attr__
donne la liste des attributs d'une instance.la source
__attr__
dans la description mais utilisez__attrs__
dans le code. Aucun n'a fonctionné pour moi (werkzeug.datastructures.FileStorage)