J'ai remarqué que lorsqu'une instance avec une méthode surchargée Tout d'abord, pourquoi cela se produit-il? Deuxièmement, est-il un moyen de corriger ce comportement de __ str __ code> est transmise à la fonction code> imprimer code> comme argument, elle imprime comme prévu. Cependant, lors du passage d'un conteneur contenant l'une de ces instances à
Imprimer code>, il utilise la méthode
__ RECR __ code>. C'est-à-dire que
impression (x) code> affiche la représentation de chaîne correcte de
x code> et
impression (x, y) code> fonctionne correctement, mais < Code> Imprimer ([x]) CODE> ou
Imprimer ((x, y)) code> imprime le
__ RECR __ code> représentation. P>
imprimer code> dans cette circonstance? P>
3 Réponses :
Parce que lorsque vous imprimez la liste, vous recherchez généralement du point de vue du programmeur ou du débogage. Si vous vouliez afficher la liste, vous traiteriez ses éléments de manière significative, la RECI est donc utilisée.
Si vous souhaitez que vos objets soient imprimés dans des conteneurs, définissez REC P>
class MyObject: def __str__(self): return "" __repr__ = __str__
Le problème avec le conteneur à l'aide des objets ' __ str __ code> serait l'ambiguïté totale - que signifierait cela, disons, si
impression L code> a montré
[1 , 2] code>?
l code> pourrait être
['1, 2'] code> (une liste d'éléments unique dont l'élément de chaîne contient une virgule) ou l'une des quatre listes de 2 points (car chaque élément peut être une chaîne ou int). L'ambiguïté du type est courante pour
d'impression code> bien sûr, mais l'ambiguïté totale du nombre d'éléments (car chaque virgule pourrait em> délimiter des éléments
Je ne suis pas sûr pourquoi em> exactement le arguments pour cela: p>
- Les conteneurs refusent de deviner ce que l'utilisateur souhaite voir sur Str (conteneur) - Environnement, délimiteurs, etc. P>
- REC (article) affiche généralement les informations de type - Apostrophes autour des chaînes, des noms de classe, etc. p>
blockQuote> Il est donc plus clair sur ce qui est exactement dans la liste (puisque la représentation des chaînes de l'objet pourrait avoir des virgules, etc.). Le comportement ne s'en va pas, par Guido "BDFL" Van Rossum: P> Permettez-moi de sauver tout le monde beaucoup de
temps et dire que je suis opposé à cela
changer, et que je crois que ça
causerait beaucoup trop de perturbations
être accepté cela près de la bêta. P>
blockQuote> MAINTENANT, il existe deux façons de résoudre ce problème pour votre code. P> La première consiste à la sous-classe et maintenant pour le tester: p> Je pense personnellement que c'est un Une idée terrible. Certaines fonctions - telles que L'autre solution est simplement d'écrire votre propre fonction Les deux solutions exigent que vous Refacteur Code existant, malheureusement - mais le comportement de __ str __ code> La méthode d'une liste renvoie le
__ rep __ code> des objets contenus dans - donc je l'ai regardé up: [python-3000] pep: str (conteneur) devrait appeler str (item), non REC (article)
Liste code> et à mettre en œuvre votre propre
__ str __ code> méthode. p>
aléatoire.sample code>, comme démontré - retournez réellement
list code> objets - même si vous avez des listes sous-classées. Donc, si vous prenez cette route, il peut y avoir beaucoup de résultats
= strlist (fonction (myList)) code> appels, ce qui pourrait être inefficace. C'est aussi une mauvaise idée car alors vous aurez probablement la moitié de votre code en utilisant des objets réguliers code> code> car vous ne les imprimez pas et l'autre moitié en utilisant
strlist code> Objets, qui Peut conduire à votre code devenir messier et plus déroutant. Néanmoins, l'option est là et c'est le seul moyen d'obtenir la fonction code> imprimer code> (ou la déclaration, pour 2.x) pour se comporter de la façon dont vous le souhaitez. P>
strlist () code> qui renvoie la chaîne comme vous le souhaitez: p>
str (conteneur) code> est là pour rester. p> p>
Très bonne réponse. Je veux juste noter qu'il existe un moyen plus idiomatique d'exprimer le code que vous avez écrit pour __ str __ code>:
def __str __ (auto): éléments = "," .join ([STR (article) pour l'article en soi]); retour "[{0}]". Format (éléments) code> (évidemment, divisé sur plusieurs lignes). Le point principal est que
rejoindre code> est le moyen préféré d'insérer
, code> (ou une autre chaîne) entre chaque élément d'une liste.