使用属性

时间:2016-05-24 12:08:18

标签: python python-3.x namedtuple

我有一些已定义属性的类,我现在正在寻找一种方法将数据打包到一个命名元组中以与数据库交互。我想将一些属性(但不是全部)放入命名元组中,以便在从数据库中检索数据时分配字段名称。

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期间无法计算属性。

在这种情况下,有人可以提出建议吗?

1 个答案:

答案 0 :(得分:1)

是的,这是错误的做法。我知道使用它来制作真正的短代码很诱人,但它只会弄乱其他东西。保持简单,以便它对所有读者(包括未来你)明显地显而易见。

class FooV2(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    # c and d and stuff

def retrieve_data():
    conn = sqlite3.connect('/foodata')
    cursor = conn.cursor()
    cursor.execute('SELECT a, b FROM foos')
    for row in cursor.fetchall():
        foo = FooV2(*row)
        print(foo.a, foo.b)