我正在考虑一种情况,我有一个对象“交易”,它有很多属性,比如帐户、金额、日期、货币、类型等。
我从不打算改变这些数据点,计算逻辑将存在于其他类中。我的问题是,为了保存数据而实例化数千个对象是不是很糟糕的 Python 设计?我发现嵌入类中的数据更容易处理,而不是试图将其塞进某种数据结构的组合中。
我正在考虑一种情况,我有一个对象“交易”,它有很多属性,比如帐户、金额、日期、货币、类型等。
我从不打算改变这些数据点,计算逻辑将存在于其他类中。我的问题是,为了保存数据而实例化数千个对象是不是很糟糕的 Python 设计?我发现嵌入类中的数据更容易处理,而不是试图将其塞进某种数据结构的组合中。
不,这完全没问题。事实上,Python 在标准collections
模块中已经支持它:
from collections import namedtuple
Transaction = namedtuple("Transaction", ["account", "amount"])
而不是class Transaction(object):
等。请注意,这namedtuple
是一种“类工厂”,您需要将要构造的类的名称作为字符串传递给它。这不一定是您将结果绑定到的名称,但这样做仍然是一个好主意。命名元组类型类似于 Pascal 中的记录或 C 中的结构:具有命名成员但自身没有重要行为的数据持有者。
用法:
>>> 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
我想说无论如何,所有的价值都是对象。假设您将有一个字典 {'transaction name':[123,'GBP','12/12/12',1234,'in']},而不是事务类实例。现在这个字典又是一个对象,不同的是它不是你自己的类。无论如何,一切都是对象。某物是一个物体这一事实,并不会自动使它变得笨重、大、慢或其他。可能您仍然需要考虑在给定时间内要在内存中保留多少对象的这些事务?
在我看来,这是清晰的代码设计问题。假设现在您有一本具有操作方法的类书,接受事务对象作为属性。当此操作方法将使用对象属性时,它会比引用列表的第 n 个元素要清晰得多。
事实上,它是一个类,它也让您有机会在未来修改或添加功能。例如,您可能想要添加所有交易的日志记录,或者在某个时候提取方法。