2012-06-23 10 views
7

myślę o sytuacji, w której mam obiektu „transakcja”, który ma sporo właściwości do niego jak konta, kwota, data waluty, typ itpobiektów o nr Zachowanie

Nigdy planują zmutować te punkty danych, a logika obliczeń będzie żyła w innych klasach. Moje pytanie brzmi: czy jest to kiepski projekt Pythona do tworzenia tysięcy obiektów w celu przechowywania danych? Uważam, że dane są dużo łatwiejsze do pracy z osadzonymi w klasie, niż próbują wepchnąć je w jakąś kombinację struktur danych.

Odpowiedz

8

Nie, to jest w porządku. W rzeczywistości, Python posiada wsparcie dla niego w standardowym collections modułu:

from collections import namedtuple 

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

zamiast class Transaction(object): itp pamiętać, że namedtuple jest rodzajem „klasy fabryki” i trzeba przekazać go nazwę klasy, której skonstruowany jako ciąg. To nie musi być nazwa, do której wiążemy wynik, ale robienie tego nadal jest dobrym pomysłem. Nazwane typy krotek są analogiczne do rekordów w języku Pascal lub struktur w C: właściciele danych o nazwanych członkach, ale nie mają znaczących własnych zachowań.

Zastosowanie:

>>> 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

Dobra odpowiedź i sposób, w jaki bym to zrobił. Jedyną alternatywą, jaką mogę sobie wyobrazić, jeśli niektóre pola byłyby rzadkie, byłby 'dict' (potencjalnie oszczędzający na' __slots__') –

+0

@JonClements: struktura musiałaby być bardzo rzadka, by uzasadnić użycie 'dyktatu', ponieważ te przeważają przez duże kwoty (przynajmniej 1/3, jak sądzę). –

+0

Yup - ale pomyślałem, że wrzucę to ze względu na kompletność. Biorąc pod uwagę przypadek użycia PO, twoja odpowiedź (przynajmniej dla mnie) jest poprawna i powinna zostać zaakceptowana. –

1

Powiedziałbym, że wszystkie wartości są obiektami tak. Załóżmy, że zamiast instancji klasy transakcyjnej masz słownik {"nazwa transakcji": [123, "GBP", "12/12/12", 1234, "w"]}. Teraz ten słownik znów jest obiektem, a różnica polega na tym, że nie była to twoja własna klasa. W każdym razie wszystko jest przedmiotem. Fakt, że coś jest przedmiotem, nie powoduje, że staje się on przestrzenny, duży, wolny lub cokolwiek innego. Prawdopodobnie nadal będziesz potrzebował rozważenia na temat tych transakcji, ile z tych obiektów chcesz zachować w pamięci w określonym czasie?

To kwestia jasnego projektu kodu, moim zdaniem. Powiedzmy, że masz teraz książkę klasy, która ma metodę działania, akceptującą obiekty transakcji jako atrybut. Gdy ta metoda działania będzie wówczas używać właściwości obiektu, będzie to znacznie wyraźniejsze niż gdyby dotyczyło na przykład n-tego elementu listy.

Fakt, że jest klasą, daje także możliwość zmiany lub dodania funkcjonalności w przyszłości. Na przykład możesz dodać rejestrowanie wszystkich transakcji lub wycofać metodę w pewnym momencie.

+0

Widzę twój punkt, ale OP stwierdził: "Nigdy nie planuję zmutować tych punktów danych, a logika obliczeń będzie żyła w innych klasach." –

+0

Mam to, zawsze myślę tak samo, a potem okazuje się, że naprawdę muszę coś zmienić po kilku tygodniach. To były moje argumenty, odpowiadające na pytanie "... czy to kiepski projekt Pythona do tworzenia tysięcy obiektów tylko po to, by przechowywać dane ...?" Elastyczność przyszłego rozwoju jest jednym z nich. – Damian

Powiązane problemy