這段代碼有什麼問題?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.
這段代碼有什麼問題?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.
你需要調用列表初始化:
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'>
我想通它出於我自己:self
是list
的子類的一個實例,所以它不能被鑄造爲列表仍然是MyList
對象。
不,'self'是對'MyList'實例的引用。 Python沒有投射。見Martijn Pieter的答案。 – chepner
@chepner雖然在技術上是正確的,但即使對於理解名稱引用/指向對象的方法以及對可變與不可變類型的影響的表達式來說,它也是非常常見的,以表示這樣一種關係,例如「x_is a_ list of three Integers 「甚至x被分配爲a = 7 – cfwschmidt
從'list'繼承時'list .__ init __(self)'也可以工作嗎? – Wolf
@Wolf:是的,但是這會排除多重繼承,例如將這個類作爲基礎與另一個類一起使用。在這種情況下,「列表」可能不是MRO中的下一個班級。 –
感謝您指出!我已經在這裏找到了簡短的答案:[* Subclassing Built-in Types *](http://www.cafepy.com/article/python_attributes_and_methods/ch03s02.html)。 * MRO *我希望我正確地解決*方法解決順序*。 – Wolf