如何在自定义 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
装饰器,但我不明白如何使用它。
谁能举个简单的例子?我也非常感谢您提供一些参考资料。
collections.UserList
是 good example 如何正确实施 collections.abc.MutableSequence
API.
- 查看 Raymond Hettinger 关于 Python 的抽象基础 类 的 YouTube talk 以及如何使用它们。
typing.overload
装饰器与函数的运行时实现无关。它的唯一目的是帮助静态类型检查。 how/when 上的好博客 here。
我想像列表一样使用 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
装饰器,但我不明白如何使用它。
谁能举个简单的例子?我也非常感谢您提供一些参考资料。
collections.UserList
是 good example 如何正确实施collections.abc.MutableSequence
API.- 查看 Raymond Hettinger 关于 Python 的抽象基础 类 的 YouTube talk 以及如何使用它们。
typing.overload
装饰器与函数的运行时实现无关。它的唯一目的是帮助静态类型检查。 how/when 上的好博客 here。