Pregunta

Parece que hay diferentes formas en que __repr__ La función puede devolver.

Tengo una clase de información que almacena varias cosas, algunas de las cuales no quiero que los usuarios de la clase estén por sí mismos. Reconozco que nada está protegido en Python y podrían sumergirlo y establecerlo de todos modos, pero parece definirlo en __init__ hace que sea más probable que alguien lo vea y asume que está bien pasarlo.

(Ejemplo: booleanos que se establecen mediante una función de validación cuando determina que el objeto ha sido completamente poblado y valores que se calculan a partir de otros valores cuando se almacena suficiente información para hacerlo ... por ejemplo, A = B + C, por lo que una vez A y B se establecen, entonces se calcula C y el objeto está marcado válido = verdadero).

Entonces, dado todo eso, ¿cuál es la mejor manera de diseñar la salida de __ 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)'

... El punto del tipo C sería no tomar todas las cosas que establecería 'privado' en C ++ como argumentos para el constructor, y hacer que los compañeros de equipo que usen la clase lo establezcan usando las funciones de la interfaz, incluso si es más trabajo para ellos. En ese caso, definiría un constructor que no tenga ciertas cosas, y una función separada que sea un poco más difícil de notar, a los efectos de __repr__

Si hace alguna diferencia, planeo almacenar estos objetos de Python en una base de datos utilizando su __repr__ Salir y recuperarlos usando eval(), al menos a menos que tenga una mejor manera. La consecuencia de un compañero de equipo que crea un objeto completo manualmente en lugar de pasar por las funciones de interfaz adecuadas es solo que un tipo de recuperación de información podría ser inestable hasta que alguien descubra lo que hizo.

¿Fue útil?

Solución

los __repr__ El método está diseñado para producir la salida más útil para el desarrollador, no para el enduser, por lo que solo usted realmente puede responder esta pregunta. Sin embargo, normalmente iría con la opción B. La opción A no es muy útil, y la opción C es innecesariamente detallada: no sabe cómo se importa su módulo de todos modos. Otros pueden preferir la opción C.

Sin embargo, si desea almacenar objetos de Python es una base de datos, use pickle.

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

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

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

Si está usando Python más antiguo (pre-3.x), tenga en cuenta que cPickle es más rápido, pero pickle es más extensible. Pickle funcionará en algunas de sus clases sin ninguna configuración, pero para objetos más complicados, es posible que desee escribir recolectores personalizados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top