Considérez cette classe:
class foo(object):
pass
La représentation de chaîne par défaut ressemble à ceci:
>>> str(foo)
"<class '__main__.foo'>"
Comment puis-je faire de cet affichage une chaîne personnalisée?
Implémentez __str__()
ou __repr__()
dans la métaclasse de la classe.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
À utiliser __str__
si vous entendez une chaîne de caractères lisible, à utiliser __repr__
pour des représentations non ambiguës.
_representation
au corps de classe etreturn self._representation
dans la__repr__()
méthode de la métaclasse.__repr__
pour représenterC
. Une alternative à avoir un_representation
membre est de créer une fabrique de métaclasses qui produit une métaclasse avec le bon__repr__
(cela pourrait être bien si vous l'utilisez beaucoup).la source
instances
la classe, pas pour la classe elle-même.Si vous devez choisir entre
__repr__
ou__str__
opter pour le premier, comme par défaut l'implémentation__str__
appelle__repr__
quand elle n'a pas été définie.Exemple de Vector3 personnalisé:
Dans cet exemple,
repr
renvoie à nouveau une chaîne qui peut être directement consommée / exécutée, alors qu'ellestr
est plus utile comme sortie de débogage.la source
__repr__
vs__str__
soit correct, cela ne répond pas à la question réelle, qui concerne les objets de classe, pas les instances.La réponse approuvée d'Ignacio Vazquez-Abrams est tout à fait juste. Il s'agit cependant de la génération Python 2. Une mise à jour pour le Python 3 actuel serait:
Si vous voulez du code qui s'exécute à la fois sur Python 2 et Python 3, le module six vous a couvert:
Enfin, si vous avez une classe que vous souhaitez avoir une représentation statique personnalisée, l'approche basée sur les classes ci-dessus fonctionne très bien. Mais si vous en avez plusieurs, vous devrez générer une métaclasse similaire à
MC
chacune, et cela peut devenir fastidieux. Dans ce cas, aller plus loin dans votre métaprogrammation et créer une fabrique de métaclasses rend les choses un peu plus propres:impressions:
La métaprogrammation n'est pas quelque chose dont vous avez généralement besoin tous les jours, mais quand vous en avez besoin, elle frappe vraiment!
la source
Ajoutant à toutes les bonnes réponses, ma version avec décoration:
stdout:
Les inconvénients:
C
sans super classe (nonclass C:
)C
les instances seront des instances d'une dérivation étrange, c'est donc probablement une bonne idée d'ajouter également un__repr__
pour les instances.la source