2016-11-27 16 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

「クラッシュ」とはどういう意味ですか?エラーメッセージが表示されますか?常に完全なエラーメッセージ(トレースバック)を表示してください。 – 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)メソッドオーバーライドすることができます:あなたはovercomplicateなぜ

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

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

出力(順次)物事?なぜdictオブジェクトを継承し、updateメソッドを使用してください。

さらにUserDictcollectionsモジュールから継承することをお勧めします。

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を渡す方が良いです。

関連する問題