Итак, я создал свой собственный класс именованных кортежей на основе dict:
class t(dict):
def __getattr__(self, v):
try:
return self[v]
except KeyError:
raise AttributeError("Key " + str(v) + " does not exist.")
def __init__(self, *args, **kwargs):
for source in args:
for i, j in source.items():
self[i] = j
for i, j in kwargs.items():
self[i] = j
>>> thing = t(cow=10, moo='moooooooo')
>>> thing.cow
10
>>> thing.moo
'moooooooo'
Смысл использование dict - это то, что я могу использовать оператор ** splat, а также чтобы все это можно было json'd как dict. Двойной цикл for в init таков, что я могу сразу восстановить его из dict после десериализации .
Единственное, что мне не хватает, - это то, что вы можете делать с кортежами с несколькими присваиваниями, например
>>> thing = (1, 3, ('blargh', 'mooo'))
>>> a, b, (c, d) = thing
>>> a
1
>>> b
3
>>> c
'blargh'
>>> d
'mooo'
Можно ли каким-то образом добиться такого поведения с моим собственным типом данных? может переопределить или какой-то класс, от которого я могу наследовать, чтобы получить такое поведение?