Как можно расширять или подклассы namedtuples с множеством дополнительных @properties?
Для некоторых можно просто написать текст ниже; но есть много, , так что я ищу генератор или фабрику свойств. Одним из способов было бы генерировать текст от _fields
и исполнять его; другой будет add_fields с тем же эффектом во время выполнения.
(Мои @props должны получить строки и поля в базе данных разбросаны по нескольким таблицам, так что rec.pname
является persontable[rec.personid].pname
; но namedtuples-с-смарт-полей будет иметь другое использование тоже.)расширяет Python namedtuple со многими @properties?
""" extend namedtuple with many @properties ? """
from collections import namedtuple
Person = namedtuple("Person", "pname paddr") # ...
persontable = [
Person("Smith", "NY"),
Person("Jones", "IL")
]
class Top(namedtuple("Top_", "topid amount personid")):
""" @property
.person -> persontable[personid]
.pname -> person.pname ...
"""
__slots__ =()
@property
def person(self):
return persontable[self.personid]
# def add_fields(self, Top.person, Person._fields) with the same effect as these ?
@property
def pname(self):
return self.person.pname
@property
def paddr(self):
return self.person.paddr
# ... many more
rec = Top(0, 42, 1)
print rec.person, rec.pname, rec.paddr
Вы не ответили на свой вопрос? –
Я не понимаю вопроса. Может быть, вы хотите, чтобы свойства отображались в кортеже? Перезагрузите getitem, если хотите. – Pepijn
Я тоже смущен. Вы, кажется, делаете именно то, что должны быть, чтобы получить эффект, о котором вы спрашиваете. Какая у вас проблема? – Omnifarious