2016-11-27 90 views
1

好的,让我们假设我有一个名为Tab的类,并且该类有一个方法,它接收字典的键和值,并将它变成一个巨大的字典。需要在不改变它的情况下查看类对象

class Tab(): 

def __init__(self): 
    if not 'table' in dir(self): 
     self._table = {}   

def add_table(self, key, value):  
    self._table[key] = value 

现在,如果我是有功能和字典

dic = {'A': ['A', 'B','C'], 'B':['D', 'E','F']} 
def read_table(): 
    table = Tab() 
    for key in dic: 
     table.add_table(key, dic[key]) 
    return table 
test = read_table() 

如果我是运行这个它会运行良好,但如果我这样做,

new_test = test['A'] 

它会崩溃。我知道我可以通过将对象转换回字典来解决此问题,但我需要将类型作为Tab类(我之前定义的类)。

我该怎么做?

+0

你是什么意思'崩溃'?你有错误信息吗?始终显示有问题的完整错误消息(Traceback)。 – furas

+0

请参阅[__getitem__](https://docs.python.org/3/reference/datamodel.html#object.__getitem__)和[__setitem__](https://docs.python.org/3/reference/datamodel.html #object .__ setitem__) – furas

回答

2

为了使Tab实例的行为就像一本字典,你可以Tab类中重写__getitem__(self, item)__setitem__(self, key, value)__repr__(self)方法:

class Tab(): 

    def __init__(self): 
     if not 'table' in dir(self): 
      self._table = {} 

    def add_table(self, key, value): 
     self._table[key] = value 

    def __getitem__(self, item): 
     return self._table[item] 

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

    def __repr__(self): 
     return self._table.__repr__() 

dic = {'A': ['A', 'B','C'], 'B':['D', 'E','F']} 
... 
# read_table() function declaration (omitted) 
... 
test = read_table() 
new_test = test['A']  # accessing dict element 
test['C'] = ['G','H','I'] # setting a new dict element 

print(new_test) 
print(test)  # printing Tab instance as a dict 
print(type(test)) 

输出(按顺序):

['A', 'B', 'C'] 
{'B': ['D', 'E', 'F'], 'A': ['A', 'B', 'C'], 'C': ['G', 'H', 'I']} 
<class '__main__.Tab'> 
0

为什么你过分复杂化事情呢?为什么不继承dict对象,并使用update方法。

或甚至更好从collections模块继承UserDict

from collections import UserDict 

class Tab(UserDict): 
    pass 

dic = {'A': ['A', 'B','C'], 'B':['D', 'E','F']} 

def read_table(dic): 
    table = Tab() 
    table.update(dic) 
    return table 

read_table(dic).data['A'] 

而且最好是通过在OBJ功能read_table

相关问题