I'm thinking about a situation where I have an object "Transaction", that has quite a few properties to it like account, amount, date, currency, type, etc.
I never plan to mutate these data points, and calculation logic will live in other classes. My question is, is it poor Python design to instantiate thousands of objects just to hold data? I find the data far easier to work with embedded in a class rather than trying to cram it into some combination of data structures.
No, this is perfectly fine. In fact, Python has support for it in the standard collections
module:
from collections import namedtuple
Transaction = namedtuple("Transaction", ["account", "amount"])
instead of class Transaction(object):
etc. Note that namedtuple
is a kind of "class factory" and you need to pass it the name of the class to be constructed, as a string. That need not be the name you bind the result to, but doing so is still a good idea. Named tuple types are analogous to records in Pascal or structs in C: data holders with named members but no significant behavior of their own.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With