IT评测·应用市场-qidao123.com
标题:
python使用魔法函数__getitem__实现字典和列表式访问自定义类型
[打印本页]
作者:
铁佛
时间:
2024-11-1 09:22
标题:
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])
复制代码
发现几种比较常用的访问方式:
int
slice
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]]: ...
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4