プロパティが既に定義されているクラスがいくつかあります。データベースとやりとりするために名前付きタプルにデータをパックする方法を探しています。データベースからデータを取得するときにフィールド名を割り当てることができるように、名前付きタプルにいくつかのプロパティ(ただしすべてではない)を持たせたいと思います。名前付きタプルをプロパティでサブクラス化する
from collections import namedtuple
import sqlite3
Foo = namedtuple('Foo', 'a, b')
class FooChild(Foo):
def do_some_calculation(self):
self.d = 2
return self.d
@property
def b(self):
return (self.a,)*2 + (self.d,)
@property
def c(self):
return 'bar'
def retrieve_data():
conn = sqlite3.connect('/foodata')
cursor = conn.cursor()
cursor.execute('SELECT a, b FROM foos')
for foo in map(Foo._make, cursor.fetchall()):
print(foo.a, foo.b)
foo = Foo(11,())
print(foo.a, foo.b, foo._asdict())
しかしprint(foo._asdict())
という名前のタプルは不変であるため、OrderedDict([('a', 11), ('b',())])
を返します。
namedtuple
のインスタンス化中に 'b'プロパティを計算することはできません。
誰かがこのような状況に行くためにアドバイスできますか?
なぜこのために名前付きタプルをサブクラス化していますか? – jonrsharpe
'namedtuple'のアイデアは、eponymのドキュメントから来ました。データベース内の既存のレコードを取得するとき、現在はretrieve_dataに表示されているように、フィールドに直接名前を付けることができます。私は、新しく作成されたレコードと、dbから取得された既存のレコードとの間に同じ基本的な構造を持たせようとしています。間違ったアプローチですか? –