92 votes

Impression de toutes les instances d'une classe

Avec une classe en Python, comment définir une fonction pour imprimer chaque instance de la classe dans un format défini dans la fonction ?

4voto

Python n'a pas d'équivalent à #allInstances de Smallktalk car l'architecture n'a pas ce type de table centrale d'objets (bien que les Smallktalk modernes ne fonctionnent pas vraiment comme cela non plus).

Comme le dit l'autre affiche, il faut gérer explicitement une collection. Sa suggestion d'une méthode d'usine qui maintient un registre est une façon tout à fait raisonnable de le faire. Vous pouvez souhaiter faire quelque chose avec des références faibles afin de ne pas avoir à suivre explicitement l'élimination des objets.

2voto

gimel Points 30150

Vous voulez peut-être dire quelque chose comme __str__ :

object.__str__(self)

Appelée par la fonction intégrée str() et par l'instruction print pour calculer la représentation "informelle" d'un objet sous forme de chaîne de caractères. Cette fonction diffère de la fonction réprimer () en ce sens qu'il ne doit pas nécessairement s'agir d'une expression Python valide : une représentation plus pratique ou plus concise peut être utilisée à la place. La valeur de retour doit être un objet de type chaîne de caractères.

Un exemple trivial :

>>> class dummy(object):
...     def __init__(self):
...         pass
...     def __str__(self):
...         return "I am a dummy"
...     
>>> d1=dummy()
>>> d2=dummy()
>>> print d1,d2
I am a dummy I am a dummy
>>>

2voto

Daniel Naab Points 9857

Il n'est pas clair si vous devez imprimer toutes les instances de la classe en même temps ou lorsqu'elles sont initialisées, ni si vous parlez d'une classe que vous contrôlez ou d'une classe d'une bibliothèque tierce.

Dans tous les cas, je résoudrais ce problème en écrivant une fabrique de classes utilisant le support des métaclasses de Python. Si vous n'avez pas le contrôle de la classe, mettez à jour manuellement le fichier __metaclass__ pour la classe ou le module que vous suivez.

Voir http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html pour plus d'informations.

1voto

alperen atik Points 21

Dans mon projet, j'ai été confronté à un problème similaire et j'ai trouvé une solution simple qui peut également fonctionner pour vous en listant et en imprimant vos instances de classe. La solution a fonctionné sans problème avec la version 3.7 de Python ; elle a donné lieu à des erreurs partielles avec la version 3.5 de Python.

Je vais copier-coller les blocs de code pertinents de mon récent projet.

```
instances = [] 

class WorkCalendar:
    def __init__(self, day, patient, worker):
        self.day = day
        self.patient = patient
        self.worker= worker
    def __str__(self):
        return f'{self.day} : {self.patient} : {self.worker}'

En Python, la fonction __str__ à la fin, détermine comment l'objet sera interprété sous forme de chaîne de caractères. J'ai ajouté la méthode : entre les crochets, ils correspondent tout à fait à ma préférence pour une lecture de type "Pandas DataFrame". Si vous appliquez ce petit __str__ vous ne verrez pas de descriptions de types d'objets lisibles par une machine, ce qui n'a aucun sens pour des yeux humains. Après avoir ajouté cette fonction __str__ vous pouvez ajouter vos objets à votre liste et les imprimer comme vous le souhaitez.

appointment= WorkCalendar("01.10.2020", "Jane", "John")
instances.append(appointment)

Pour l'impression, votre format en __str__ fonctionnera par défaut. Mais il est également possible d'appeler tous les attributs séparément :

for instance in instances:
    print(instance)
    print(instance.worker)
    print(instance.patient)

Pour une lecture plus détaillée, vous pouvez consulter la source : https://dbader.org/blog/python-repr-vs-str

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