在子类化列表之前需要考虑什么?
我最近在解决一个编码问题时,有人看了我的代码,说继承列表(list)是不好的做法(而我的问题和这个类没有关系)。他提到不应该这样做,因为这样会带来很多不好的副作用。这是真的吗?
我想问一下,继承列表通常是不好的选择吗?如果是的话,原因是什么?另外,在Python中继承列表之前,我应该考虑哪些因素呢?
4 个回答
我觉得我首先要问自己的是,“我的新对象真的是一个列表吗?”它的表现像列表吗?说话像列表吗?还是说它其实是别的东西?
如果它确实是一个列表,那么所有标准的列表方法都应该适用。
如果这些标准的列表方法不适用,那说明你的对象应该包含一个列表,而不是直接就是一个列表。
在早期的Python版本(大概是2.2?)中,继承列表是个坏主意,原因有很多技术上的考虑,但在现代的Python中,这样做是没问题的。
在Python的collections
模块中,有一种叫做抽象基类的东西,特别是MutableSequence
,它们在实现类似列表的类时非常有用。这些功能在Python 2.6及以后的版本中都可以使用。
使用这些抽象基类,你可以先实现你类的“核心”功能,然后它会自动提供一些与你定义的内容逻辑相关的方法。
举个例子,如果你在一个继承自collections.Sequence
的类中实现了__getitem__
这个方法,那么你的类就会自动拥有__contains__
、__iter__
和其他一些方法。
不过,你可能还是想用一个内部的列表对象来处理一些复杂的操作。
继承 list
并没有什么好处。 你重写的方法不会被使用,这样可能会导致一些意想不到的错误。而且,像用 self.append
代替 self.foos.append
,或者用 self[4]
而不是 self.foos[4]
来访问数据,常常会让人感到困惑。你可以创建一个功能完全和列表一样的东西,或者(更好的是)根据你的需要,和列表相似的程度,只需继承 object
。