"מבנים" בפיתון struct-like python

"מבנים" בפיתון struct-like python

(השאלה נשאלה שלשום גם בwhatsup, ללא תשובה בשלב זה):
בפיתון, אני מנסה לכתוב אוביקט שהגישה אליו תהיה כך:

page[2].records[7].color = "ffff"


כמו כן, אני מנסה ליצור מצב בו למשתנה הזה יש toString וגם fromString (או כל דרך נוחה אחרת ליצור serialize שלו לjson).
הקוד שלי יצא מאד מסורבל (מה לעשות, פיתון לא שפת אמי). האם יש דרך יותר "נכונה" ליצור את זה?




class record ():
'''
'''
def __init__(self, title, color, action, data) :
self.title = title
self.color = color
self.action = action
self.data = data

def toDict(self) :
ans = {'title':self.title, 'color':self.color, 'action':self.action, 'data':self.data}
return ans

def toString(self):
return '%s' % self.toDict()

class records():
'''
'''
def __init__(self):
self.f_record = {}

def __getitem__(self, key):
if not(self.f_record.get(key,None)):
self.f_record[key] = record(None,None,None,None)
return self.f_record[key]

def __setitem__(self, key, value):
self.f_record[key] = value

def toDict(self):
ans = {}
for i in self.f_record:
ans = self.f_record.toString()
return ans

def toString(self):
return '%s' % self.toDict()

class page():
'''
'''
def __init__(self):
self.records = records()

def toString(self):
return self.records.toString()

class papers():
'''
'''
def __init__(self):
self.f_papers = {}

def __getitem__(self,key):
if not (self.f_papers.get(key,None)):
self.f_papers[key] = page()
return self.f_papers[key]

def toString(self):
ans = {}
for i in self.f_papers:
ans = self.f_papers.toString()

return '%s' % ans

#tests

a = papers()
a[1].records[1] = record('group','red','open', 'group1')
a[1].records[2] = record('group','green','open', 'group2')
a[2].records[7].title = "ffff"
print a[1].records[1].toString()
print a.toString()
 

פונציק

New member
נראה לי שהבנתי מה אתה מנסה לעשות

אבל איך המילון אמור להיראות בסוף?

אני לא מומחה בפייתון, אז אל תצפה להמון ממני.
 
תשובה שקבלתי בstackoverflow

http://stackoverflow.com/questions/20650653/struct-like-in-python

כעקרון - לבצע ירושה של dict כך שאין חריגה בפניה לאלמנט לא קיים, כך שכמות הclasses שאני מתחזק מצטמצמת ל-2, ובמקביל מתקבלת תמיכה מובנית בjson, כך שלא צריך לתחזקת את toString ואת fromString (ששם היתה לי שגיאה של חוסר תאימות לjson).
 
easy_install recordtype

from recordtype import recordtype

class Record(recordtype('Record', [('title', 'default'), ('color', 'black'), ('action', None), ('data',0)])):
pass

class Page(recordtype('Page', [('records', [Record()])])):
pass


לגבי דה-סריאליזציה: נראה שהקינון לא עושה טוב ל simplejson.loads. לא ברור לי למה, צריך לחשוב על זה קצת.
 
למעלה