Question

Il semble qu'il existe différentes façons la fonction __repr__ peut revenir.

J'ai une classe objInfo qui stocke un certain nombre de choses, dont certains que je ne veux pas particulièrement les utilisateurs de la classe ensemble par eux-mêmes. Je reconnais rien est protégé en python et ils pourraient tout simplement plonger dans et mettez-le de toute façon, mais semble le définir dans __init__ rend une personne plus susceptible peut le voir et l'assumer va bien passer juste dans.

(Exemple: booléens qui se préparent par une fonction de validation lorsqu'il détermine que l'objet a été entièrement rempli, et les valeurs qui se calcule à partir d'autres valeurs lorsque suffisamment d'informations sont stockées pour le faire ... par exemple, A = B + C , donc une fois que A et B sont fixés ensuite C est calculé et l'objet est marqué Valid = Vrai).

Alors, étant donné tout ce qui est la meilleure façon de concevoir la sortie __ __ repr?

    bob = InfoObj(Name="Bob")
    # Populate bob.

    # Output type A:
    bob.__repr__()
'<InfoObj object at 0x1b91ca42>'

    # Output type B:
    bob.__repr__()
'InfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

    # Output type C:
    bob.__repr__()
'InfoObj.NewInfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'

... le point de type C serait de ne pas prendre avec plaisir tous les trucs que je avais mis « privé » en C ++ comme arguments au constructeur, et de faire vos coéquipiers en utilisant la classe mis en place à l'aide des fonctions d'interface, même si il est plus de travail pour eux. Dans ce cas, je définirais un constructeur qui ne prend pas certaines choses, et une fonction distincte qui est un peu plus difficile à l'avis, aux fins de __repr__

Si cela fait une différence, je prévois de stocker ces objets python dans une base de données en utilisant leur sortie __repr__ et les récupérer à l'aide eval(), au moins, à moins que je viens avec une meilleure façon. La conséquence d'un coéquipier créer un objet complet manuellement au lieu de passer par les fonctions d'interface appropriées est juste qu'un type de recherche d'information peut être instable jusqu'à ce que quelqu'un chiffres sur ce qu'il a fait.

Était-ce utile?

La solution

La méthode __repr__ est conçu pour produire la plus sortie utile pour le développeur, et non l'utilisateur final, de sorte que vous pouvez vraiment répondre à cette question. Cependant, je vais généralement avec l'option B. Option A est pas très utile, et l'option C est inutilement bavard - vous ne savez pas comment votre module est importé de toute façon. D'autres préfèrent l'option C.

Cependant, si vous voulez stocker des objets Python est une base de données, l'utilisation pickle.

import pickle
bob = InfoObj(Name="Bob")

> pickle.dumps(bob)
b'...some bytestring representation of Bob...'

> pickle.loads(pickle.dumps(bob))
Bob(...)

Si vous utilisez Python (pré-3.x) plus, notez que cPickle est plus rapide, mais pickle est plus extensible. Pickle travaillera sur certaines de vos classes sans aucune configuration, mais pour des objets plus complexes, vous voudrez peut-être écrire Picklers personnalisés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top