2013-01-23 50 views
6

這段代碼有什麼問題?Python內置類型子類

class MyList(list): 
    def __init__(self, li): self = li 

當我創建的MyList有一個實例,例如,MyList([1, 2, 3]),然後我打印這種情況下,我得到的是一個空列表[]。如果MyDict是子類list,是不是MyDict a list本身?

注意:都在Python 2.x和3.x.

回答

15

你需要調用列表初始化:

class MyList(list): 
    def __init__(self, li): 
     super(MyList, self).__init__(li) 

在功能分配到self剛剛替換局部變量列表,不分配什麼實例:

>>> class MyList(list): 
...  def __init__(self, li): 
...   super(MyList, self).__init__(li) 
... 
>>> ml = MyList([1, 2, 3]) 
>>> ml 
[1, 2, 3] 
>>> len(ml) 
3 
>>> type(ml) 
<class '__main__.MyList'> 
+0

從'list'繼承時'list .__ init __(self)'也可以工作嗎? – Wolf

+0

@Wolf:是的,但是這會排除多重繼承,例如將這個類作爲基礎與另一個類一起使用。在這種情況下,「列表」可能不是MRO中的下一個班級。 –

+0

感謝您指出!我已經在這裏找到了簡短的答案:[* Subclassing Built-in Types *](http://www.cafepy.com/article/python_attributes_and_methods/ch03s02.html)。 * MRO *我希望我正確地解決*方法解決順序*。 – Wolf

0

我想通它出於我自己:selflist的子類的一個實例,所以它不能被鑄造爲列表仍然是MyList對象。

+2

不,'self'是對'MyList'實例的引用。 Python沒有投射。見Martijn Pieter的答案。 – chepner

+0

@chepner雖然在技術上是正確的,但即使對於理解名稱引用/指向對象的方法以及對可變與不可變類型的影響的表達式來說,它也是非常常見的,以表示這樣一種關係,例如「x_is a_ list of three Integers 「甚至x被分配爲a = 7 – cfwschmidt