2013-12-18 132 views
0

使用Python,我想寫的對象,它的訪問將是這樣的:結構,像蟒蛇

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

(「錄音」有一些領域)。

該對象應該被導出爲json字符串,當然也可以從json導入(目前是unwrittten),所以我添加了toString()方法。

關鍵是代碼非常「笨拙」。有沒有辦法(使用python)來製作更多「高明」的代碼?

我的代碼:

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[i] = self.f_record[i].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[i] = self.f_papers[i].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" 
a[1].records[1].title = 'title :-) ' 

print a[1].records[1].toString() 
print a.toString() 
+0

您能更具體地瞭解您對代碼不滿意的內容以及您希望代碼的內容嗎? – BrenBarn

+1

您的對象除了存儲數據外什麼也不做。你首先需要這些課程嗎?除了'toString'和'toDict'之外,還有其他方法嗎? – Blender

+1

值得指出的一件事是,如果你想序列化爲JSON,你應該使用'json'模塊而不是依賴'dict .__ str__'(順便說一下,如果你想返回一個對象,其默認字符串格式可以只需返回'str(self.toDict())')。 Python的dict表示看起來非常接近,大多數情況下都是有效的JSON,但是如果不使用JSON庫,會出現一些會讓你感到頭疼的情況。 – Iguananaut

回答

1

你可以使用dict本身,使之更容易一點:

from collections import defaultdict 

class PropertyDict (dict): 
    def __getattr__ (self, attr): 
     if self.has_key(attr): 
      return self.__getitem__(attr) 
     return object.__getattr(self, attr) 

    def __setattr__ (self, attr, value): 
     self.__setitem__(attr, value) 

class Record (PropertyDict): 
    def __init__ (self, title = None, color = None, action = None, data = None): 
     self.title = title 
     self.color = color 
     self.action = action 
     self.data = data 

class Page (PropertyDict): 
    def __init__ (self): 
     self.records = defaultdict(Record) 

papers = defaultdict(Page) 
papers[1].records[1] = Record('group', 'red', 'open', 'group1') 
papers[1].records[2] = Record('group', 'green', 'open', 'group2') 

papers[2].records[7].title = "ffff" 
papers[1].records[1].title = 'title :-) ' 

print(papers[1].records[1]) 
print(papers) 

由於對象現在是dict的子類型,因此使用json序列化它很簡單。僅用於反序列化,你將不得不編寫自己的編碼處理程序。

+0

Tnx很多。這與J.F.塞巴斯蒂安(json的使用)是非常有用的。 –

1

要序列化你的對象到JSON:

import json 

json_text = json.dumps(your_obj.as_dict()) 

從JSON創建對象:

obj = YourClass.from_dict(json.loads(json_text)) 

你可以很容易實現的方法:

class YourClass(object): 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 
    @classmethod 
    def from_dict(cls, attrs): 
     return cls(**attrs) 
    def as_dict(self): 
     return dict(self.__dict__) 
    def __str__(self): 
     return json.dumps(self.as_dict()) 
    def __repr__(self): 
     # see http://docs.python.org/3/library/types.html#types.SimpleNamespace 
     d = self.as_dict() 
     items = ("{}={!r}".format(k, d[k]) for k in sorted(d)) 
     return "{}({})".format(type(self).__name__, ", ".join(items)) 

例子:

>>> obj = YourClass(title="foo", name="bar") 
>>> obj.color = "ffffff" 
>>> obj.name 
'bar' 
>>> obj 
YourClass(color='ffffff', name='bar', title='foo') 
>>> print(obj) 
{"name": "bar", "color": "ffffff", "title": "foo"} 
>>> obj.as_dict() 
{'name': 'bar', 'color': 'ffffff', 'title': 'foo'} 

您可以定義from_jsonas_json方法,如果你想使用單行