首页 > 编程语言 >python使用魔法函数__getitem__实现字典和列表式访问自定义类型

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

时间:2024-11-01 10:41:50浏览次数:1  
标签:__ ... val 自定义 python def getitem NDArray

起因

想起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]]: ...

标签:__,...,val,自定义,python,def,getitem,NDArray
From: https://www.cnblogs.com/chenhan-winddevil/p/18519705

相关文章

  • 使用axios下载二进制流文件
    1.下载文件的api接口,在api.js中书写exportconstdownloadFiles=(params)=>{returnaxios.post(`${baseUrl}/downloadFiles`,params,{responseType:"blob",});};2.调用api接口,在需要使用下载的方法中书写,使用async和await异步加载的方式letres=awaitdow......
  • 【C++】智能指针的正确使用方式
    本文将从这几方面讲解智能指针:智能指针的应用场景分析智能指针的性能分析:为什么shared_ptr性能比unique_ptr差指针作为函数参数时应该传,传值、传引用,还是裸指针?对于智能指针的使用,实际上是对所有权和生命周期的思考1.unique_ptr:专属所有权1.1unique_ptr介绍我们大......
  • laravel11:中间件传递参数
    一,官方的文档:参考地址:https://docs.golaravel.com/docs/middleware二,演示:功能:一个中间件负责验证用户是否已登录,    传递参数的作用是:在已登录基础是否验证真人身份核验,值为1时要核验,其他情况可以不用1,为中间件注册一个别名:bootstrap/app.php->withMidd......
  • 在 .NET 8 中使用 Serilog:详细讲解与日志级别介绍
    Serilog是一个功能强大且灵活的日志记录库,特别适合在.NET8应用程序中使用。它支持结构化日志记录,便于日志的查询和分析。本文将详细介绍在.NET8中使用Serilog的方法,包括配置、日志级别的介绍和使用示例。一、什么是Serilog?Serilog是一个开源的结构化日志记录库,旨在简......
  • Vmware workstation虚拟机导入到esxi虚拟机
    前言VMwareWorkstation是直接在windows系统下安装软件,安装后再在软件里面安装虚拟机,而ESXi相当于一个linux操作系统,直接像安装linux系统一样安装后,再在另一台windows电脑上通过web或者安装vcenter连接访问esxi,然后再安装和管理虚拟机。 操作1、先在Vmwareworkstati......
  • recycleview 滑动辅助
    importandroid.content.Contextimportandroid.graphics.Rectimportandroid.util.DisplayMetricsimportandroid.util.Logimportandroid.view.Viewimportandroidx.recyclerview.widget.GridLayoutManagerimportandroidx.recyclerview.widget.LinearLayoutManageri......
  • localStorage、sessionStorage、cookie数据共享问题
    1、localStorage必须要符合同源策略(协议、域名、端口相同)才能共享同网址共享2、sessionStorage(1)只有同一个浏览器窗口才共享,不能在不同的标签页或窗口之间共享数据,即使它们属于同一个源。(2)如果通过window.open再次打开这个页面,那么数据会跟着复制过去,但是也不共享//在标签......
  • 深入浅出:AutoMapper 的使用与最佳实践
    在现代软件开发中,特别是在.NET环境中,数据传输对象(DTO)与实体模型之间的映射是一个常见的需求。AutoMapper是一个强大的库,可以简化这一过程,减少样板代码,提高开发效率。本文将详细讲解AutoMapper的基本概念、各种用法以及最佳实践。什么是AutoMapper?AutoMapper是一个对象到......
  • 项目添加埋点
    1、稳定性埋点index.html中添加埋点代码<scriptsrc='https://wpkgate-emas.ding.zj.gov.cn/static/wpk-jssdk.1.0.2/wpkReporter.js'crossorigin='true'></script><script>//稳定性try{constconfig={bid:'xxxxxxx&......
  • 如何进行能源效率优化?
    优化能源效率需要遵循以下步骤:1.识别并分析能源消费者;2.设定优化目标;3.选择适当的优化策略;4.实施技术改进措施;5.持续监控和反馈。进行能源效率优化的起点是明确能源使用的主要领域。1.识别并分析能源消费者进行能源效率优化的第一步是了解能源的主要消费者。这包括建筑物、设......