如何在自定义 class 上实现 MutableSequence

How to implement MutableSequence on custom class

我想像列表一样使用 class。我发现继承和实现 collections.abc.MutableSequence 使 class 类似列表,但我不知道如何为整数和切片重载 __getitem____setitem__ 等方法分别.

Pycharm 生成如下代码:

class Test(collections.abc.MutableSequence):
    def insert(self, index: int, object: _T) -> None:
        pass

    @overload
    @abstractmethod
    def __getitem__(self, i: int) -> _T: ...

    @overload
    @abstractmethod
    def __getitem__(self, s: slice) -> MutableSequence[_T]: ...

    def __getitem__(self, i: int) -> _T:
        pass

    @overload
    @abstractmethod
    def __setitem__(self, i: int, o: _T) -> None: ...

    @overload
    @abstractmethod
    def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...

    def __setitem__(self, i: int, o: _T) -> None:
        pass

    @overload
    @abstractmethod
    def __delitem__(self, i: int) -> None: ...

    @overload
    @abstractmethod
    def __delitem__(self, i: slice) -> None: ...

    def __delitem__(self, i: int) -> None:
        pass

    def __len__(self) -> int:
        pass

我知道Python不支持重载但是有几种方法可以做到

但我只想跟着Pycharm的流程走。

所以我想使用 @overload 装饰器,但我不明白如何使用它。

谁能举个简单的例子?我也非常感谢您提供一些参考资料。

  1. collections.UserListgood example 如何正确实施 collections.abc.MutableSequence API.
  2. 查看 Raymond Hettinger 关于 Python 的抽象基础 类 的 YouTube talk 以及如何使用它们。
  3. typing.overload装饰器与函数的运行时实现无关。它的唯一目的是帮助静态类型检查。 how/when 上的好博客 here