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

起因

想起C++可以实现运算符重载,以实现以数组的方式([])访问我们的类.

我想要实现一个类,可以同时用类似于字典和

就想到python能不能实现这个效果,而且显然是可以的,不然numpy是怎么实现属于自己的数组的?

# 期望实现效果
class myclass:
	pass
c = myclass()
# 像这样使用[]访问我们自己的类
print(c[0])

经过

这样进行测试

class C(object):
 def __getitem__(self, val):
 print(val)
c = C()
print(c[4])
print(c[0,2])
print(c[0:2])

发现几种比较常用的访问方式:

  1. int
  2. slice
  3. tuple

也就是我们在用[]进行访问的时候实际上对应地传入的是这几种类型.

那么我们只需要在__getitem__里对类型进行判断进行不同的处理即可:

class C(object):
 def __getitem__(self, val):
 if isinstance(val,slice):
	 pass
	 elif isinstance(val,int):
	 pass
	elif isinstance(val,tuple):
	pass
	elif isinstance(val,str):
	pass

那么前三种分支就是以列表式索引访问,最后一种则是用字典式访问.

自己定义好类型的数据结构就可以愉快地进行访问了.

numpy支持的索引方式

来自于:\numpy\__init__.pyi:

 @overload
 def __getitem__(self, key: (
 NDArray[integer[Any]]
 | NDArray[bool_]
 | tuple[NDArray[integer[Any]] | NDArray[bool_], ...]
 )) -> ndarray[Any, _DType_co]: ...
 @overload
 def __getitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...]) -> Any: ...
 @overload
 def __getitem__(self, key: (
 None
 | slice
 | ellipsis
 | SupportsIndex
 | _ArrayLikeInt_co
 | tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...]
 )) -> ndarray[Any, _DType_co]: ...
 @overload
 def __getitem__(self: NDArray[void], key: str) -> NDArray[Any]: ...
 @overload
 def __getitem__(self: NDArray[void], key: list[str]) -> ndarray[_ShapeType, _dtype[void]]: ...
作者:winddevil原文地址:https://www.cnblogs.com/chenhan-winddevil/p/18519705

%s 个评论

要回复文章请先登录注册