4

简单来说,我想要的是tuple一个或两个额外的方法。__new__或者__init__不会被修改。

我想创建一个抽象基类,它是collections.abc.Sequence. 然后我想将它用于基本上是一个tuple子类。类图类似于:

   collections.abc.Sequence
          /       \
         /         \
        /           \
      MyABC       tuple
        \           /
         \         /
          \       /
           MyClass

原因:

  • MyABC定义了一些自定义接口。它在那里,所以第三方不会被迫子类化MyClass
  • tuple需要它的性能和已经实现的方法。

问题:

  • 惯用的方式只是写class MyClass(MyABC, tuple)还是我应该玩寄存器?
  • 我还有其他明显的问题吗?
  • 是否会因为子类化而失去空间和性能优势tuple
4

1 回答 1

2
  • 只是编写 class MyClass(MyABC, tuple) 的惯用方式还是应该使用寄存器?

    在我看来,这是一种非常惯用的方式。这也就是所谓的“传承钻石”。的__init__方法MyClass可能看起来像这样

  • 我还有其他明显的问题吗?

    好吧,这取决于问题中没有明确说明的某些方面,例如您到底想做什么?你怎么样?这个新子类的使用模式如何?您在新课程中使用的新方法有多通用/具体?在不创建子类的情况下,有一种更有效/更清洁/可读/更容易/无论如何的方式吗?即使是,是否仍然值得做,如果您将获得更多的灵活性/可读性等等?

    作为一般规则,我会说创建子类不仅没问题,而且如果您经常使用它和/或它将使您能够更轻松地解决某些问题而不会产生剧烈/非常不希望的附带影响,那么创建子类也是可取的。

  • 元组的空间和性能优势是否会因为子类化而丢失?

    这是一个棘手的问题。同样,取决于你在做什么以及你如何设计你的子类等等......,可能。请记住,例如,元组是不可变类型,与可变类型相比,此属性具有一些性能优势。因此,如果您例如以某种方式修改此属性,则与原始元组相比,这可能代表一些损失。我也不太确定 Python 将如何看到元组的子类。我的意思是,我不知道 Python 是否仍然会“盲目地相信”您的类是不可变的,因此仍然表现得完全像一个元组。如果不是,那么在您的具体情况下实际上会有多糟糕。不可变/可变问题只是一个示例,可能还存在其他更相关的问题,但我不能肯定地说......也许你可以做一些小规模的测试来衡量性能。

考虑其中一些方面(Guido 本人)也可能是一个好主意。

我希望这有帮助!

于 2013-05-10T15:38:19.177 回答