如何在自定义类上实现 MutableSequence

问题描述

我想使用像 list 这样的类

我发现继承和实现 MutableSequence 使类列表类似

但我不知道如何为整数和切片分别重载 __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,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.UserList 是如何正确实现 collections.abc.MutableSequence API 的good example
  2. 查看 Raymond Hettinger 撰写的关于 Python 抽象基类的 YouTube talk 以及如何使用它们。
  3. typing.overload 装饰器与函数的运行时实现无关。它的唯一目的是帮助静态类型检查。关于如何/何时使用它的好博客here