6

我正在使用一个模拟 python 列表的类。当我在没有索引的情况下访问它时,我想将它作为 python list() 返回。

使用普通列表():

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

我得到的,基本上是:

>>> a = MyList([1,2,3])
>>> 一个
<MyList 对象在 0xdeadbeef>

我不知道哪种 dunder 方法(如果有)可以让我自定义这种行为?

我认为它会是 __ 得到 __ ?虽然 list() 没有实现 get/set/delete - 我猜是因为它是内置的?

4

4 回答 4

5

您正在寻找的方法将是__repr__。另请参阅http://docs.python.org/reference/datamodel.html#object。代表

于 2012-09-30T22:21:42.020 回答
4

您应该覆盖__repr__类中的方法(也可以选择__str__方法),请参阅这篇文章以讨论差异。

像这样的东西:

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

正如评论中所指出的,str()调用__repr__if__str__未定义,但repr()不调用__str__if__repr__未定义。

于 2012-09-30T22:16:43.653 回答
3

一个非常简单的例子:

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

输出:

[1, 2, 3]
MyList([1, 2, 3])
1
2
3
于 2012-09-30T22:27:55.880 回答
0

请允许我回答我自己的问题 - 我相信这是我正在寻找的 __ repr __ 方法。如果我错了,请纠正我。这是我想出的:

def __repr__(self):
    return str([i for i in iter(self)])
于 2012-09-30T22:22:59.297 回答