在列入子列表之前要考虑什么?

Edw*_*ams 17 python list subclassing

我最近正在处理我遇到的编码问题,有人看着代码说子类列表很糟糕(我的问题与那个类无关).他说你不应该这样做,而且它带来了一堆不好的副作用.这是真的?

我问的是列表是否通常对子类不好,如果是,那么原因是什么.或者,在Python中为子类化列表之前我应该​​考虑什么?

int*_*ted 17

特别是,在实现类似列表的类时,模块中提供的抽象基类非常有用.这些在Python 2.6及更高版本中可用.collectionsMutableSequence

使用ABCs,您可以实现类的"核心"功能,它将提供逻辑上取决于您定义的方法.

例如,实现__getitem__collections.Sequence派生类将足以提供您的类__contains__,__iter__以及其他方法.

您可能仍希望使用包含的列表对象来执行繁重的工作.


Mik*_*ham 17

子类化没有任何好处list.这些方法都不会使用您覆盖的任何方法,因此您可能会遇到意外错误.此外,这是非常令人困惑经常做这样的事情self.append,而不是self.foos.append或特别self[4],而不是self.foos[4]访问您的数据.你可以创建一个完全像列表或(更好)的东西,但是就像你真正想要的列表一样,只是进行子类化object.

  • 如果我们要将属性添加到列表中该怎么办?例如,假设我们有mylist = [].我们想要像mylist.x = 3这样的东西. (3认同)
  • 这似乎与python 3不一致.为了这个目的,它们明确包含[`collections.UserList`](https://docs.python.org/3.4/library/collections.html#collections.UserList).它甚至建议现在可以从列表中进行子类化:"直接从列表中继承子类的能力部分取代了对这个类的需求;" (我知道这是一个古老的话题,上面的评论在编写时可能都是正确的,只是想让人们现在明白这个问题) (2认同)

Nic*_*ood 11

我想我问自己的第一个问题是,"我的新对象真的是一个列表吗?".它像列表一样走路,像列表那样说话吗?还是别的什么?

如果它是一个列表,那么所有标准列表方法都应该有意义.

如果标准列表方法没有意义,那么您的对象应该包含列表,而不是列表.

在旧的python(2.2?)中,由于各种技术原因,子类别列表是个坏主意,但在现代的python中它很好.

  • +1只有在确实100%有意义时才继承,否则构成. (4认同)

Joe*_*Joe 6

尼克是对的.此外,虽然我不能说Python,但在其他OO语言(Java,Smalltalk)中,对列表进行子类化是一个坏主意.一般应该避免继承,而是使用委托组合.

而是创建一个容器类并将调用委托给列表.容器类具有对列表的引用,您甚至可以在自己的方法中公开列表的调用和返回.这增加了灵活性,允许您稍后更改实现(不同的列表类型或数据结构),而不会破坏任何代码.如果您希望列表执行不同的listy类型的事情,那么您的容器可以执行此操作并使用普通列表作为简单的数据结构.想象一下,如果你有47种不同的列表用途.你真的想要维护47个不同的子类吗?相反,你可以通过容器和接口来做到这一点.一个类维护并允许人们通过接口调用新的和改进的方法,并且实现仍然隐藏.