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.