需要查看类对象而不更改它

时间:2016-11-27 08:22:54

标签: python dictionary

好吧,假设我有一个名为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类(我之前定义的那个)。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

要使Tab实例的行为与字典相似,您可以覆盖__getitem__(self, item)类中的__setitem__(self, key, value)__repr__(self)Tab方法:

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'>

答案 1 :(得分:0)

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

甚至可以更好地从UserDict模块继承collections

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']

最好在read_table函数中传递obj。