2012-09-30 33 views
6

Pracuję z klasą, która emuluje listę Pythona. Chcę go zwrócić jako listę python(), gdy dostęp do niego bez indeksu.Emulacja listy w języku Python

z normalnym listy():

 
>>> a = [1,2,3] 
>>> a 
[1,2,3] 

co mi chodzi w istocie:

 
>>> a = MyList([1,2,3]) 
>>> a 
<MyList object at 0xdeadbeef> 

nie mogę dowiedzieć się, które metody Dunder (jeśli w ogóle) pozwoliłaby mi dostosować to zachowanie?

Myślałem, że będzie __ dostać __? chociaż list() nie implementuje get/set/delete - chyba dlatego, że jest wbudowany?

+0

wysłałem odpowiedź, ale faktycznie nie jestem pewien co masz na myśli. Czy możesz podać przykład tego, co chcesz osiągnąć? Jeśli chcesz pokazać swoją listę po wpisaniu 'a' w konsoli, to szukasz metody' __repr__' –

+0

To, co widzisz w powłoce interaktywnej, gdy wpiszesz tylko nazwę, to ciąg repr (REPResentational) . Podobnie jest z pierwszym, gdzie prawdziwa lista emituje łańcuch, który wygląda jak kod źródłowy. Idealnie, 'eval (repr (object))' powinien działać dla typów prostych. Więc nie jesteś "uzyskiwania dostępu" go, gdy pokazujesz go w ten sposób, ale "szarpiąc" go. – Keith

+0

Tak, właśnie tego szukałem. Nie wiedziałem, co się tam naprawdę dzieje. – la11111

Odpowiedz

4

Powinieneś przesłonić metodę __repr__ w swojej klasie (i opcjonalnie także metodę __str__), zobacz tę post, aby omówić różnice.

coś takiego:

class MyList(object): 
    def __repr__(self): 
     # iterate over elements and add each one to resulting string 

Jak zauważył w komentarzach, str() wzywa __repr__ jeśli __str__ nie jest zdefiniowana, ale repr() nie wymaga __str__ jeśli __repr__ nie jest zdefiniowana.

+2

Jeśli zamierzasz zaimplementować tylko jeden, zaimplementuj '__repr__' zamiast' __str__'. 'str' nazywa' __repr__' jeśli '__str__' nie jest zdefiniowany, ale' repr' nie wywołuje '__str__', jeśli' __repr__' nie jest zdefiniowany. – senderle

+0

@senderle za wyjaśnienia, zaktualizowałem moją odpowiedź –

0

Pozwól mi odpowiedzieć na własne pytanie - Uważam, że szukam metody __ repr __. Proszę popraw mnie jeżeli się mylę. Oto co wymyśliłem:

def __repr__(self): 
    return str([i for i in iter(self)]) 
+1

Chyba wystarczy 'return repr (self.lis)'. –

3

bardzo prosty przykład:

class MyList(object): 
    def __init__(self,arg): 
     self.mylist = arg 
    def __repr__(self): 
     return 'MyList(' + str(self.mylist) + ')' 
    def __str__(self): 
     return str(self.mylist) 
    def __getitem__(self,i): 
     return self.mylist[i] 

a = MyList([1,2,3]) 
print a 
print repr(a) 
for x in a: 
    print x 

wyjściowa:

[1, 2, 3] 
MyList([1, 2, 3]) 
1 
2 
3 
Powiązane problemy