【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)

news2024/12/23 2:43:24

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、魔术方法
  • 二、构造方法
  • 三、__ getitem __方法
  • 四、__ len __方法


前言

参考视频:视频

一、魔术方法

首先看一看chatgpt对魔术方法(特殊方法)的解释:
Python的魔术方法(Magic Methods),也称为特殊方法(Special Methods),是一些在类定义中使用**双下划线(__)**包围的方法。这些方法可以被Python解释器调用,用于实现对象的特定行为或操作。
以下是一些常用的Python魔术方法:

__init __(self, …): 构造函数,用于初始化对象的属性。

__len __(self): 返回对象的长度。

__getitem __(self, key): 返回对象中指定键的值。

setitem(self, key, value): 设置对象中指定键的值。

…等等

这些魔术方法可以让Python类的实例对象表现得像内置类型一样,从而方便地实现自定义的行为和操作。
其中构造函数是最经典的特殊方法

二、构造方法

Python类的构造方法是__init__方法,用于初始化对象的属性。当我们创建一个类的实例时,__init__方法会被自动调用,用于为新创建的对象设置初始的属性值。__init__方法通常需要至少一个参数self,用于引用新创建的对象本身,其他参数根据需要自行添加。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 20)
print(p.name)  # 输出:Alice
print(p.age)  # 输出:20

在上述代码中,我们定义了一个Person类,其中的__init__方法接收两个参数name和age,分别用来初始化对象的name和age属性。当我们创建一个Person对象时,会自动调用__init__方法,并将name和age参数传递给它,以便设置新创建的对象的name和age属性。最后,我们通过打印对象的属性值来验证对象是否正确地初始化。

三、__ getitem __方法

__getitem__方法是Python的一个魔术方法,用于实现索引操作。当我们对一个对象进行索引操作时,例如obj[key],Python解释器会自动调用该对象的__getitem__方法,并将索引值key作为参数传递给它。

class MyList:
    def __init__(self, data):
        self.data = data

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0])  # 输出:1
print(my_list[2])  # 输出:3

正常情况下运行代码会报错 无法打印元素:
在这里插入图片描述

但是稍稍做一些修改,在类内加入特殊方法getitem救能打印列表元素了

class MyList:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0])  # 输出:1
print(my_list[2])  # 输出:3

在这里插入图片描述

在学深度学习的时候一直有个疑问:在生成mydataset数据集对象的时候,__getitem___会被自动调用吗?
__getitem__方法不会在生成对象的时候自动调用,它是在通过Dataset对象索引访问数据集中的元素时自动调用的。也就是说,当我们通过下标访问数据集中的元素时,例如 dataset[0],就会调用__getitem__方法来获取数据集中的第一个元素。
在使用数据集时,通常会将数据集对象传递给DataLoader类,然后使用DataLoader来迭代数据集。在迭代过程中,DataLoader会自动调用Dataset对象的__getitem__方法来获取数据集中的元素,并将这些元素组成一个批次(batch)返回。

同理__len__也不是在对象生成的时候自动调用的。

四、__ len __方法

和前面类似直接上代码:

class MyDataset:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

my_dataset = MyDataset([1, 2, 3, 4, 5])
print(len(my_dataset))  # 输出:5

结果:
在这里插入图片描述

在上述代码中,其中__len__方法返回了数据集中的样本数量,__getitem__方法用于获取数据集中的单个样本。这样,在使用DataLoader迭代数据集时,DataLoader会自动调用MyDataset对象的__len__方法来获取数据集的长度,以便在迭代过程中确定迭代的次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理笔记(大全)摘要模块图类关系图模块全展开【xlsxwriter】统计常量模块1 xlsxwrite…

数据爬虫爬数据时常遇到的问题

第一,可能不能直接通过pyppeteer简单的直接page.querySelectorAll()获取所有元素然后直接 str(await (await element_songer_name.getProperty("title")).jsonValue()) 得到数据值,主要原因可能是#document问题, 所以遇到这个问题…

vue项目配置不同环境打包指令(vue-cli2、vue-cli3项目)

目录 一、vue-cli3项目:1、项目根目录创建环境文件2、 配置打包指令3、打包生成不同的dist文件夹 二、vue-cli2项目1、配置指令2.创建环境文件3、config/index.js中添加 三、遇到的问题1.vue-cli3项目配置打包指令,没有生成css文件--mode test2、vue-cli…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端

收获总结: 了解go函数的可变参数的使用,还有切片展开的方式即…了解了HTTP通信方式,hinder的使用了解了go.mod ,import 和modoule的使用 分布式缓存需要实现点对点的通信,我们可以使用HTTP来实现节点之间的通信&…

Linux·IO子系统和文件系统读写流程

目录 1.概述 2.linux IO子系统和文件系统读写流程 3.IO之流程与buffer概览 4.IO队列和IO调度 1.概述 分析一下写操作: char *buf malloc(MAX_BUF_SIZE); strncpy(buf, src, , MAX_BUF_SIZE); fwrite(buf, MAX_BUF_SIZE, 1, fp); fclose(fp); 以下图为例&…

九耶丨钛伦特-用深度学习实现垃圾图像分类(二)

3 构建模型 这里大家可以使用自己在项目 2 中寻找到的最好的模型结构,做为示例,这里以实验2-3 中的 snet 模型为基础,并进行细微的调整。 样例代码: 需要注意的是,我们在第一层卷基层之后增加了一层池化层,主要是为了降…

大数据技术之Spark

第1章 Spark概述 1.1 什么是Spark 回顾:Hadoop主要解决,海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Hadoop的Yarn框架比Spark框架诞生的晚,所以Spark自己也设计了一套资源调度…

30天学会《Streamlit》(1)

30学会《Streamlit》是一项编码挑战,旨在帮助您开始构建Streamlit应用程序。特别是,您将能够: 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第1天 - 建立…

Java面向对象高级【注解和反射】

目录 注解 什么是注解? 自定义注解 元注解 反射 什么是反射 静态语言和动态语言 动态语言 静态语言 对比 Class类 Java内存分析 类加载过程 类加载器 获取运行时类的完整结构 通过Class对象实例化对象 1.调用Class对象的newInstance 2.Constructor…

保姆级教程!如何在 Anolis 8 上构建基于 Nydus 和 Dragonfly 的镜像加速解决方案?

文/云原生 SIG 01 背景 镜像是容器技术的基础之一,在云原生场景下,业务的正常运作离不开对镜像的制作、分发和运行。当前的镜像在使用的过程中,需要将镜像从仓库中全量拉取到本地,再由容器 engine 进行解压,堆叠挂载…

【JUC进阶】详解synchronized锁升级

文章目录 1. synchronized概述2. synchronized 的实现原理2.1 Java对象组成2.2 Monitor2.3 从字节码角度看synchronized 3. 锁升级3.1 偏向锁3.2 轻量级锁 1. synchronized概述 synchronized是一个悲观锁,可以实现线程同步,在多线程的环境下&#xff0c…

信盈达CorexM4核心板STM32F407VGT6电路原理图\电源原理图\USB的工作原理\miniUSB的分类

一、电源部分电路 Micro_USB插座中的5V与GND就是直接提供VCC与GND,其中的D与D-是接在CH340芯片上的实现串口通信的数据口。 电源VCC通过一个自恢复保险丝接在一个自锁开关上,这样就分析完一个miniUSB的提供电源的原理图了。 在原理图的右上角有一个AMS1117-3.3的器件…

RabbitMQ 高级篇 | 黑马

一、消息可靠投递 生产端的 在使用 RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。 RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 confirm 确认模式return 退回模式 rabbitmq整个消息投递的路径为: producer--->ra…

HCIP-6.6BGP配置中IGP路由表和BGP路由表、IP路由表关系

BGP配置中IGP路由表和BGP路由表、IP路由表关系1、基础配置2、配置建立IBGP对等体3、配置EBGP对等体4、使用network命令宣告路由5、路由的学习5.1、R2的路由表5.2、R1的BGP路由表5.3、R3的BGP路由表5.4、R5的BGP路由表6、AS200与AS100通信6.1、AS200出接口注入AS100IP路由表6.2、…

Go 汇编详解

动手点关注干货不迷路前言我们知道 Go 语言的三位领导者中有两位来自 Plan 9 项目,这直接导致了 Go 语言的汇编采用了比较有个性的 Plan 9 风格。不过,我们不能因咽废食而放弃无所不能的汇编。1、 Go 汇编基础知识1.1、通用寄存器不同体系结构的 CPU&…

【Docker】使用Docker Compose部署项目

目录 前言 使用 前言 如果你部署项目需要很多个容器, 并且还是在手动一个一个启动的话来试试Docker Compose, 只需要写好Docker Compose文件运行命令就能帮你一次性全启动, 对微服务很友好啊~ 使用 运行以下命令查看是否有版本号, 确保你已经安装了Docker Compose docker…

使用sealos工具部署k8s

为什么使用sealos工具:简单、快、完全兼容 k8s、给100年认证 sealos使用最新版本: 官网:https://www.sealyun.com/ 码:https://github.com/labring/sealos 官方介绍什么是sealos Sealos 是以 kubernetes 为内核的云操作系统发行版…

精彩回顾|4.8 Beijing Rust Meetup

2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust X的meetup。开发者们不仅线下积极报名参与,更在线上直播中踊跃参与互动,一起探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用和实践。演讲者与…

从EXCEL BOM 描述中提取部分信息---正则表达式使用

从EXCEL BOM描述中提取关键的信息,用于建库填写内容,或者检查BOM等都会用到,如下大概通过两种方式实现信息的提取 1.手动Excel中提取 2.将如上1的方式用python实现,可以实现批量操作,减少操作带来的错误,…