¿Cómo se pueden extender o subclasificar namedtups con muchas @properties adicionales?
Para algunos, uno puede simplemente escribir el siguiente texto; pero hay muchos, , entonces estoy buscando un generador o fábrica de propiedades. Una forma sería generar texto desde _fields
y ejecutarlo; otro sería un add_fields con el mismo efecto en tiempo de ejecución.
(Mis @props son para obtener filas y campos en una base de datos dispersos en varias mesas, de manera que rec.pname
es persontable[rec.personid].pname
; pero namedtuples-con-smart-campos tendrían otras aplicaciones también.)¿extiende Python namedtuple con muchas @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
¿No respondió su propia pregunta allí? –
No entiendo la pregunta. ¿Tal vez quieres que las propiedades aparezcan en la tupla? Sobrescribe getitem si quieres eso. – Pepijn
Estoy confundido también. Parece que estás haciendo exactamente lo que deberías hacer para obtener el efecto que estás preguntando. ¿Qué problema estás teniendo? – Omnifarious