2016-04-21 7 views
2

Wie kann ich unter Verwendung von __getitem__ so etwas tun?Verwendung von __getitem__ beim Überladen von Operatoren mit Python

class Computers: 

    def __init__(self, processor, ram, hard_drive): 
     self.processor = processor 
     self.ram = ram 
     self.hard_drive = hard_drive 

was möchte ich in der Lage sein, zu tun ist,

C = Computers('2.4 Ghz','4 gb', '500gb') 

C['h'] zurückzukehren 500gb

und C['p','r','h'] zurückzukehren ('2.4 Ghz', '4 gb', '500gb')

Antwort

3

Ja, Sie können. In beiden Fällen würde Ihre __getitem__ Methode mit einem Objekt aufgerufen werden. Im ersten Fall übergeben Sie ein einzelnes String-Objekt, in der zweiten übergeben Sie ein Tupel mit 3 Strings.

Griff in beiden Fällen:

def __getitem__(self, item): 
    attrmap = {'p': 'processor', 'r': 'ram', 'h': 'hard_drive'} 
    if isinstance(item, str): 
     return getattr(self, attrmap[item]) 
    # assume a sequence 
    return tuple(getattr(self, attrmap[i]) for i in item) 

Demo, einschließlich Fehlerbehandlung:

>>> C = Computers('2.4 Ghz','4 gb', '500gb') 
>>> C['h'] 
'500gb' 
>>> C['p', 'r', 'h'] 
('2.4 Ghz', '4 gb', '500gb') 
>>> C['f'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 9, in __getitem__ 
KeyError: 'f' 
>>> C['p', 'r', 'f'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 11, in __getitem__ 
    File "<stdin>", line 11, in <genexpr> 
KeyError: 'f' 
Verwandte Themen