风之猎手 发表于 2024-11-1 16:06:33

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

起因

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

这样进行测试
class C(object):
    def __getitem__(self, val):
      print(val)

c = C()
print(c)
print(c)
print(c)发现几种比较常用的访问方式:

[*]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]
      | NDArray
      | tuple] | NDArray, ...]
    )) -> ndarray: ...
    @overload
    def __getitem__(self, key: SupportsIndex | tuple) -> Any: ...
    @overload
    def __getitem__(self, key: (
      None
      | slice
      | ellipsis
      | SupportsIndex
      | _ArrayLikeInt_co
      | tuple
    )) -> ndarray: ...
    @overload
    def __getitem__(self: NDArray, key: str) -> NDArray: ...
    @overload
    def __getitem__(self: NDArray, key: list) -> ndarray]: ...
来源:https://www.cnblogs.com/chenhan-winddevil/p/18519705
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: python使用魔法函数__getitem__实现字典和列表式访问自定义类型