2013-01-23 48 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