2016-03-22 8 views
4

__setitem__を使用するときにキーのタイプをテストすることはできません。しかし、不思議なことに、複数のキーを使用するとコードの一部が省略されることがわかりました。ここに私のテストクラスです:Python __setitem__が複数のキーを使用すると奇妙なこと

class foo(): 
    def __init__(self): 
     self.data=[[1,2],[3,4],[5,6]] 

    def __getitem__(self, key): 
     return self.data[key] 

    def __setitem__(self, key, value): 
     print('Key is {0}, type of key is {1}'.format(key,type(key))) 
     self.data[key] = value 

f = foo() 

使用つのキーは、それは大丈夫だ時:

>>>f[1] = [0,0] 
    Key is 1, type of key is <class 'int'> 
>>>f[1] 
    [0, 0] 

使用2つのキーが、結果は正しいですが、何も

>>>f[1][1] = 100 

>>>f[1][1] 
    100 
をプリントアウトしていないことが理由

私はPythonで何か新しい提案をいただければ幸いです。

答えて

6

f[1][1] = 0は、それはあなたのカスタムクラスの__getitem__を呼び出し

f.__getitem__(1).__setitem__(1, 0) 

に相当します。 [0, 0]または[3, 4]またはf[1]に格納されているものを返します。いずれにしても、この値は普通のPython listです。このlist__setitem__を呼び出します。 list.__setitem__は何も印刷しません。

5

f[1]__getitem__を呼び出し、リストを返します(新しく初期化されたオブジェクトの場合は[3,4])。次に、2番目の索引付け操作f[1][1]は、戻されたオブジェクト、つまりクラスのインスタンスではないリスト[3,4]を索引付けしますが、単純に(クラスによって戻される)リスト・タイプを索引付けします。

関連する問題