简体   繁体   中英

Emulating a list in Python

I'm working with a class that emulates a python list. I want to return it as a python list() when I access it without an index.

with a normal list():

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

what I'm getting, essentially:

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

I can't figure out which dunder method (if any) would allow me to customize this behavior?

I'd think it would be __ get __ ? although list() doesn't implement get/set/delete - i guess because it's a built-in?

The method you are looking for wolud be __repr__ . See also http://docs.python.org/reference/datamodel.html#object. repr

You should override the __repr__ method in you class (and optionally the __str__ method too), see this post for a discussion on the differences.

Something like this:

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

As pointed in the comments, str() calls __repr__ if __str__ isn't defined, but repr() doesn't call __str__ if __repr__ isn't defined.

A very simple example:

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

Output:

[1, 2, 3]
MyList([1, 2, 3])
1
2
3

Allow me to answer my own question - I believe it's the __ repr __ method that I'm looking for. Please correct me if i'm wrong. Here's what I came up with:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM