微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在自定义类上实现 MutableSequence

如何解决如何在自定义类上实现 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。