2012-06-23 14 views
7

Sto pensando a una situazione in cui ho un oggetto "Operazione", che ha un bel paio di oggetti da essa come conto, importo, data, valuta, tipo, eccoggetti con nessun comportamento

non ho mai piano per mutare questi punti dati e la logica di calcolo vivrà in altre classi. La mia domanda è, è povero design Python per istanziare migliaia di oggetti solo per contenere i dati? Trovo molto più facile lavorare con i dati incorporati in una classe piuttosto che cercare di inserirli in una combinazione di strutture dati.

risposta

8

No, questo è perfettamente a posto. In realtà, Python ha il supporto per esso nel modulo standard collections:

from collections import namedtuple 

Transaction = namedtuple("Transaction", ["account", "amount"]) 

invece di class Transaction(object): ecc Si noti che namedtuple è una sorta di "fabbrica di classe" ed è necessario passare il nome della classe per essere costruito, come una stringa. Questo non deve essere il nome a cui si lega il risultato, ma farlo è comunque una buona idea. I tipi di tuple nominati sono analoghi ai record in Pascal o alle strutture in C: titolari di dati con membri nominati ma nessun comportamento significativo.

Usage:

>>> t = Transaction(account="my private account", amount=+1000) 
>>> t 
Transaction(account='my private account', amount=1000) 
>>> t.amount 
1000 
>>> t.amount += 1 
Traceback (most recent call last): 
    File "<ipython-input-6-ae60188f2446>", line 1, in <module> 
    t.amount += 1 
AttributeError: can't set attribute 
+0

Buona risposta e il modo in cui lo farei. L'unica alternativa che posso pensare se alcuni campi fossero sparsi sarebbe un 'dict '(potenzialmente salvando su' __slots__') –

+0

@JonClements: la struttura dovrebbe essere molto sparsa per giustificare l'uso di un 'dict', dal momento che quelli sovrastimare di grandi quantità (almeno 1/3, credo). –

+0

Sì, ma ho pensato di buttarlo dentro per completezza. Dato il caso d'uso dell'OP, la tua risposta (almeno per me) è corretta e dovrebbe essere accettata. –

1

direi che tutti i valori sono gli oggetti in ogni caso. Diciamo che invece dell'istanza della classe di transazione, avresti un dizionario {'nome transazione': [123, 'GBP', '12/12/12', 1234, 'in']}. Ora questo dizionario è di nuovo un oggetto e la differenza è che non era la tua classe. Tutto è comunque un oggetto. Il fatto che qualcosa sia un oggetto non lo rende automaticamente ingombrante, grande, lento o altro. Probabilmente avresti ancora bisogno di una considerazione su queste transazioni di quanti di quegli oggetti vuoi conservare nella memoria in un dato momento?

È una questione di design del codice chiaro a mio parere. Diciamo che ora hai un libro di classe che ha un metodo di azione, accettando oggetti di transazione come un attributo. Quando questo metodo di azione utilizzerà quindi le proprietà dell'oggetto, sarebbe molto più chiaro che se si riferisse ad ennesimi elementi di una lista, per esempio.

Il fatto che sia una classe ti lascia anche l'opportunità di modificare o aggiungere funzionalità in futuro. Ad esempio, potresti voler aggiungere la registrazione di tutte le transazioni o ritirare il metodo a un certo punto.

+0

Vedo il tuo punto, ma l'OP ha dichiarato: "Non ho mai in programma di modificare questi punti dati e la logica di calcolo vivrà in altre classi". –

+0

L'ho capito, penso sempre lo stesso e poi si scopre che potrei davvero aver bisogno di cambiare qualcosa dopo qualche settimana. Queste erano le mie argomentazioni che rispondevano alla domanda "... è un povero design Python per istanziare migliaia di oggetti solo per contenere i dati ...?" La flessibilità dello sviluppo futuro è una di queste. – Damian

Problemi correlati