2011-10-30 21 views
30

Nesneler için özel bir kapsayıcı türü olarak işlev gören yeni bir sınıf oluşturmak istiyorum ve köşeli parantez kullanarak erişilebilir. Örneğin, ListWrapper adı verilen bir dersim olduğunu varsayalım. obj'un ListWrapper olduğunu varsayalım. obj[0] derken, obj.access() yönteminin argüman olarak 0 ile çağrılmasını beklerim. Sonra istediğimi geri verebilirim. Mümkün mü?Köşeli parantezlerle erişilebilen bir python nesnesi oluşturun

cevap

45

Özel __getitem__[docs] yöntemini tanımlamak istersiniz.

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

test = Test() 

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

Sonuç:

 
000 
kittenkittenkitten 
+0

Mükemmel yanıt: on-point, bir doc link ve basit bir çalışma örneği içerir. –

+0

Teşekkürler! Bu işleve ulaşmak için tanımlamam gereken bazı yöntemlerin olduğunu biliyordum, bu yöntemin adının ne olduğundan emin değildim. – Ord

+0

Ummmm ... "basit bir çalışma örneği" içermemeli, "some_expression" ifadesini döndürün? –

7

Python'ın standart nesneler çoğunlukla dilde bir API içine kanca nesneleri oluşturmak için izin vermek için kullanılır __something__ adlı yöntemlerden bir dizi var. Örneğin __getitem__ ve __setitem__, [] notasyonu ile değerlerin alınması veya ayarlanması için çağrılan yöntemlerdir. Burada Python sözlüğünün bir alt sınıfına benzeyen bir şeyin nasıl oluşturulacağına dair bir örnek var: https://github.com/wavetossed/mcdict

Aslında alt sınıf sözlüğü olmadığını ve ayrıca update yöntemine sahip olduğunu unutmayın. Her ikiniz de sınıfınızın bir Python sözlüğü olarak düzgün bir şekilde maskelenmesini istiyorsanız gereklidir.

İlgili konular