2011-10-30 9 views
30

Me gustaría crear una nueva clase que actúe como un tipo especial de contenedor para objetos, y se puede acceder usando corchetes.Crear un objeto python al que se pueda acceder con corchetes

Por ejemplo, supongamos que tengo una clase llamada ListWrapper. Supongamos que obj es un ListWrapper. Cuando digo obj[0], espero que se llame al método obj.access() con 0 como argumento. Entonces, puedo devolver lo que quiera. es posible?

Respuesta

45

Quiere definir el método especial __getitem__[docs].

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

test = Test() 

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

Resultado:

 
000 
kittenkittenkitten 
+0

Excelente respuesta: en punto, incluye un enlace de doc y un ejemplo simple resuelto. –

+0

Gracias! Sabía que había algún método que debía definir para obtener esta funcionalidad, simplemente no estaba seguro de cuál era el nombre de ese método. – Ord

+0

Ummmm ... ¿no debería el "simple ejemplo resuelto" incluir 'return some_expression'? –

7

objetos estándar de Python tienen una serie de métodos denominados __something__ que se utilizan principalmente para permitir la creación de objetos que se enganchan en una API en el idioma. Por ejemplo, __getitem__ y __setitem__ son métodos que se requieren para obtener o establecer valores con la notación []. Hay un ejemplo de cómo crear algo que se parece a una subclase del diccionario de Python aquí: https://github.com/wavetossed/mcdict

Tenga en cuenta que en realidad no es un diccionario de subclases y, además, tiene un método update. Ambos son necesarios si quieres que tu clase se enmascare apropiadamente como un diccionario de Python.

Cuestiones relacionadas