这段代码有什么问题?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