2016-03-22 5 views
4

Ich möchte den Typ des Schlüssels testen, wenn Sie __setitem__ verwenden. Aber seltsamerweise fand ich, dass ein Teil des Codes weggelassen wurde, wenn mehrere Schlüssel verwendet wurden. Hier ist mein Test-Klasse:Seltsame Sache, wenn Python __setitem__ mehrere Schlüssel verwenden

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

Bei Verwendung einer Taste Es ist in Ordnung:

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

wenn Gebrauch zwei Schlüssel, Ergebnis ist richtig, aber warum nichts ausgedruckt werden

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

>>>f[1][1] 
    100 

Ich bin neu in Python jeder Vorschlag wird geschätzt!

Antwort

6

f[1][1] = 0 entspricht

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

Es ruft __getitem__ auf Ihrer benutzerdefinierten Klasse; und dies liefert [0, 0] oder [3, 4] oder was auch immer in f[1] gespeichert wurde; in jedem Fall ist dieser Wert ein einfacher Python list; Dann ruft die __setitem__ auf dieser list. list.__setitem__ druckt nichts.

5

f[1] ruft Ihre __getitem__ auf und gibt somit eine Liste zurück ([3,4] im Falle des frisch initialisierten Objekts). Dann indiziert die zweite Indizierungsoperation f[1][1] das Objekt, das zurückgegeben wurde, die Liste [3,4], die keine Instanz Ihrer Klasse ist, sondern einfach ein Listentyp (wie von Ihrer Klasse zurückgegeben).

Verwandte Themen