Pracuję z klasą, która emuluje listę Python. Chcę go zwrócić jako listę Python (), gdy uzyskam dostęp do niego bez indeksu.

Z normalną listą ():

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

Co dostaję zasadniczo:

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

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

Myślę, że to byłoby __? Chociaż lista () nie implementuje Get / Set / Delete - chyba, ponieważ jest to wbudowany?

6
la11111 1 październik 2012, 02:11

4 odpowiedzi

Najlepsza odpowiedź

Należy zastąpić metodę __repr__ w klasie (i opcjonalnie metodę __str__), zobacz to Post do dyskusji na temat różnic.

Coś takiego:

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

Jak wskazano w komentarzach, str() połączenia __repr__ Jeśli __str__ nie zostanie zdefiniowany, ale repr() nie zadzwoni do __str__ ISN 't definiowany.

4
Community 23 maj 2017, 11:58

Metoda, której szukasz Woluda be __repr__. Zobacz także http://docs.Python.org/reference/datamodel.html#object. Farstrong >Repr

5
Ashwini Chaudhary 30 wrzesień 2012, 22:23

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

Wynik:

[1, 2, 3]
MyList([1, 2, 3])
1
2
3
3
Mark Tolonen 30 wrzesień 2012, 22:27

Pozwól mi odpowiedzieć na moje własne pytanie - wierzę, że jest to metoda __ rep __, której szukam. Proszę popraw mnie jeżeli się mylę. Oto, z czym wymyśliłem:

def __repr__(self):
    return str([i for i in iter(self)])
0
la11111 30 wrzesień 2012, 22:22