【问题标题】:How to implement MutableSequence on custom class如何在自定义类上实现 MutableSequence
【发布时间】:2023-03-03 09:49:02
【问题描述】:

我想使用像列表这样的类。我发现继承和实现collections.abc.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, 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 装饰器,但我不明白如何使用它。

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

【问题讨论】:

    标签: python pycharm overloading abc


    【解决方案1】:
    1. collections.UserList 是一个good example 如何正确实现collections.abc.MutableSequence API。
    2. 查看 Raymond Hettinger 撰写的 YouTube talk,了解 Python 的抽象基类以及如何使用它们。
    3. typing.overload 装饰器与函数的运行时实现无关。它的唯一目的是帮助进行静态类型检查。关于如何/何时使用它的好博客here

    【讨论】:

    • 感谢您的回复。现在我理解 @overload 只是为了类型提示,我应该使用 isinstance 函数的条件语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多