2012-09-30 62 views
6

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

与正常名单():

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

什么我得到,主要有:

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

我想不通这dunder方法(如果有的话),可以让我定制这种行为?

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

+0

我张贴的答案,但实际上我不知道你的意思。你能举一个你想达到的例子吗?如果你想在控制台输入'a'时显示你的列表,那么你正在寻找'__repr__'方法 –

+0

当你只输入名字时,你在交互式shell中看到的是repr(REPResentational)字符串。与第一个一样,真正的列表发出一个看起来像源代码的字符串。理想情况下,'eval(repr(object))'应该适用于简单类型。所以当你这样展示时,你不会“访问”它,而是“串化”它。 – Keith

+0

是的,这正是我所寻找的。我对那里发生的事情感到困惑。 – la11111

回答

4

您应该重写您的课程中的__repr__方法(也可以选择__str__方法),请参阅此post以了解有关这些差异的讨论。

事情是这样的:

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

正如在评论中指出,str()调用__repr__如果__str__没有定义,但repr()__str__如果__repr__没有定义不调用。

+2

如果你只是要实现一个,实现'__repr__'而不是'__str__'。如果没有定义'__str__','str'调用'__repr__',但如果'__repr__'没有定义,'repr'不会调用'__str__'。 – senderle

+0

@senderle感谢您的澄清,我更新了我的答案 –

0

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

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

我想'return repr(self.lis)'就足够了。 –

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