python使用魔法函数__getitem__实现字典和列表式访问自定义类型 ...

铁佛  论坛元老 | 2024-11-1 09:22:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
起因

想起C++可以实现运算符重载,以实现以数组的方式([])访问我们的类.
我想要实现一个类,可以同时用类似于字典和
就想到python能不能实现这个结果,而且显然是可以的,不然numpy是怎么实现属于本身的数组的?
  1. # 期望实现效果
  2. class myclass:
  3.         pass
  4. c = myclass()
  5. # 像这样使用[]访问我们自己的类
  6. print(c[0])
复制代码
经过

如许进行测试
  1. class C(object):
  2.     def __getitem__(self, val):
  3.         print(val)
  4. c = C()
  5. print(c[4])
  6. print(c[0,2])
  7. print(c[0:2])
复制代码
发现几种比较常用的访问方式:

  • int
  • slice
  • tuple
也就是我们在用[]进行访问的时间实际上对应地传入的是这几种类型.
那么我们只需要在__getitem__里对类型进行判断进行差别的处理惩罚即可:
  1. class C(object):
  2.     def __getitem__(self, val):
  3.         if isinstance(val,slice):
  4.                 pass
  5.             elif isinstance(val,int):
  6.                     pass
  7.                 elif isinstance(val,tuple):
  8.                         pass
  9.                 elif isinstance(val,str):
  10.                         pass
复制代码
那么前三种分支就是以列表式索引访问,末了一种则是用字典式访问.
本身定义好类型的数据结构就可以愉快地进行访问了.
numpy支持的索引方式

来自于:\numpy\__init__.pyi:
  1.     @overload
  2.     def __getitem__(self, key: (
  3.         NDArray[integer[Any]]
  4.         | NDArray[bool_]
  5.         | tuple[NDArray[integer[Any]] | NDArray[bool_], ...]
  6.     )) -> ndarray[Any, _DType_co]: ...
  7.     @overload
  8.     def __getitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...]) -> Any: ...
  9.     @overload
  10.     def __getitem__(self, key: (
  11.         None
  12.         | slice
  13.         | ellipsis
  14.         | SupportsIndex
  15.         | _ArrayLikeInt_co
  16.         | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...]
  17.     )) -> ndarray[Any, _DType_co]: ...
  18.     @overload
  19.     def __getitem__(self: NDArray[void], key: str) -> NDArray[Any]: ...
  20.     @overload
  21.     def __getitem__(self: NDArray[void], key: list[str]) -> ndarray[_ShapeType, _dtype[void]]: ...
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表