2012-09-30 60 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