アカウント、金額、日付、通貨、タイプなど、かなりの数のプロパティを持つオブジェクト「トランザクション」がある状況を考えています。
これらのデータポイントを変更する予定はありません。計算ロジックは他のクラスに存在します。私の質問は、データを保持するためだけに何千ものオブジェクトをインスタンス化するのは貧弱な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 番目の要素を参照する場合よりもはるかに明確になります。
それがクラスであるという事実は、将来的に機能を修正または追加する機会も残します。たとえば、すべてのトランザクションのログを追加したり、ある時点でメソッドを撤回したりすることができます。