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 ?
Réponses
Trop de publicités?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.
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
>>>
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.
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
- Réponses précédentes
- Plus de réponses