Domanda

Sembra che ci siano diversi modi in cui il __repr__ La funzione può tornare.

Ho una classe InfoObj che memorizza una serie di cose, alcune delle quali non voglio particolarmente che gli utenti della classe si impostano da soli. Riconosco che nulla è protetto in Python e potrebbero semplicemente immergerlo e impostarlo comunque, ma sembra definirlo __init__ rende più probabile che qualcuno possa vederlo e presumere che vada bene passare.

(Esempio: i booleani che vengono impostati da una funzione di convalida quando determina che l'oggetto è stato completamente popolato e valori che vengono calcolati da altri valori quando vengono archiviate informazioni sufficienti per farlo ... ad esempio A = B + C, quindi una volta A e B sono impostati quindi C viene calcolato e l'oggetto è marcato valido = true.)

Quindi, dato tutto ciò, qual è il modo migliore per progettare l'output di __ 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)'

... Il punto di tipo C sarebbe quello di non prendere felicemente tutte le cose che avrei impostato "privato" in C ++ come argomenti al costruttore e fare i compagni di squadra usando la classe impostarla usando le funzioni di interfaccia anche se è più lavoro per loro. In tal caso definirei un costruttore che non prende certe cose e una funzione separata che è leggermente più difficile da notare, ai fini di __repr__

Se fa qualche differenza, ho intenzione di archiviare questi oggetti Python in un database usando il loro __repr__ Output e recuperali usando eval(), almeno a meno che non mi venga in mente un modo migliore. La conseguenza di un compagno di squadra che crea manualmente un oggetto completo invece di passare attraverso le funzioni di interfaccia adeguata è solo che un tipo di recupero di informazioni potrebbe essere instabile fino a quando qualcuno non capisce cosa ha fatto.

È stato utile?

Soluzione

Il __repr__ Il metodo è progettato per produrre l'output più utile per lo sviluppatore, non per l'Enduser, quindi solo tu puoi davvero rispondere a questa domanda. Tuttavia, in genere andrei con l'opzione B. L'opzione A non è molto utile e l'opzione C è inutilmente verbosa: non sai come viene importato il tuo modulo comunque. Altri possono preferire l'opzione C.

Tuttavia, se si desidera archiviare oggetti Python è un database, usa pickle.

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

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

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

Se stai usando Python più vecchio (pre-3.x), notalo cPickle è più veloce, ma pickle è più estensibile. Pickle funzionerà su alcune delle tue classi senza alcuna configurazione, ma per oggetti più complicati potresti voler scrivere astucci personalizzati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top