2011-10-30 8 views
30

Vorrei creare una nuova classe che funge da tipo speciale di contenitore per gli oggetti ed è possibile accedervi utilizzando parentesi quadre.Creare un oggetto python a cui è possibile accedere con parentesi quadre

Ad esempio, supponiamo di avere una classe chiamata ListWrapper. Supponiamo che obj sia un ListWrapper. Quando dico obj[0], mi aspetto che il metodo obj.access() venga chiamato con 0 come argomento. Quindi, posso restituire quello che voglio. È possibile?

risposta

45

Si desidera definire il metodo speciale __getitem__[docs].

class Test(object):  
    def __getitem__(self, arg): 
     return str(arg)*3 

test = Test() 

print test[0] 
print test['kitten'] 

Risultato:

 
000 
kittenkittenkitten 
+0

Risposta eccellente: on-point, include un collegamento doc e un esempio semplice ed esaustivo. –

+0

Grazie! Sapevo che c'era un metodo che dovevo definire per ottenere questa funzionalità, ma non ero sicuro di quale fosse il nome di quel metodo. – Ord

+0

Ummmm ... non dovrebbe "esempio semplice" includere "return some_expression'? –

7

oggetti standard di Python hanno una serie di metodi chiamati __something__ che sono per lo più utilizzati per consentire di creare oggetti che agganciano in un'API in lingua. Ad esempio, __getitem__ e __setitem__ sono metodi che vengono chiamati per ottenere o impostare valori con la notazione []. C'è un esempio di come creare qualcosa che assomiglia ad una sottoclasse del dizionario Python qui: https://github.com/wavetossed/mcdict

Nota che in realtà non è un sottoclasse di dizionario e inoltre ha un metodo update. Entrambi sono necessari se vuoi che la tua classe si mascherino correttamente come un dizionario Python.

Problemi correlati