当前位置: 首页 > news >正文

python的特殊方法——魔术方法

前言

__init__(self[])

​编辑 __call__(self [, ...])

__getitem__(self, key)

__len__(self)

__repr__(self) / __str__(self)

__add__(self, other)

__radd__(self, other)

参考文献


前言

官方定义好的,以两个下划线开头且以两个下划线结尾来命名的方法。在特定情况下,它会被自动调用,不需要我们主动调用该方法。

__init__(self[])

__init__(self, ...):构造方法,在创建对象时自动调用。用于初始化对象的属性。

class Person:def __init__(self, name):print("__init__(self, ...):构造方法,在创建对象时自动调用。用于初始化对象的属性。")self.name = name
person = Person("Alice")  # 自动调用 __init__

 __call__(self [, ...])

__call__ 方法允许一个类的实例像函数一样被调用。当你定义了这个方法后,你可以使用实例对象进行“调用”,并触发该方法。以下是一个简单的示例: 

class Adder:def __init__(self, increment):self.increment = incrementdef __call__(self, value):return value + self.increment# 创建一个 Adder 实例
add_five = Adder(5)
# 像函数一样调用实例
result = add_five(10)  # 自动调用 __call__
print(result)  # 输出: 15

__getitem__(self, key)

__getitem__ 方法允许你使用索引访问对象的元素。当你尝试访问对象的某个键或索引时,这个方法会被自动调用。以下是一个示例: 

class CustomList:def __init__(self, initial_data):self.data = initial_datadef __getitem__(self, index):return self.data[index]
# 创建一个 CustomList 实例
my_list = CustomList([10, 20, 30, 40, 50])
# 使用索引访问元素
print(my_list[2])  # 输出: 30

 输出结果为30

在这个例子中,CustomList 类实现了 __getitem__ 方法,使得我们可以像访问普通列表一样访问其内部的数据。这样,my_list[2] 实际上会调用 my_list.__getitem__(2),返回对应的元素。你对这个方法还有其他问题吗?

__len__(self)

__len__(self) 是一个特殊方法,用于定义一个对象的长度。通常在自定义类中使用,以便能够使用 len() 函数获取实例的长度。下面是一个简单的例子:

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)# 示例
my_list = MyList([1, 2, 3, 4])
print(len(my_list))  # 输出: 4

在这个例子中,MyList 类实现了 __len__ 方法,使得我们可以通过 len(my_list) 获取其内部列表的长度。 

__repr__(self) / __str__(self)

__repr__(self)__str__(self) 是两个特殊方法,用于定义对象的字符串表示。

  • __repr__ 旨在返回一个可以用来重新创建该对象的字符串,通常用于开发调试。
  • __str__ 则返回一个更易读的字符串,通常用于向用户显示。
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person(name='{self.name}', age={self.age})"def __str__(self):return f"{self.name}, {self.age} years old"# 示例
person = Person("Alice", 30)
print(repr(person))  # 输出: Person(name='Alice', age=30)
print(str(person))   # 输出: Alice, 30 years old

在这个例子中,__repr__ 返回了一个包含对象信息的字符串,适合用于调试;而 __str__ 返回了一个更简洁、易读的字符串,用于用户友好的输出。 

__add__(self, other)

__add__(self, other) 是一个特殊方法,用于定义对象之间的加法操作。通过实现这个方法,你可以自定义如何将两个对象相加。

下面是一个简单的例子,展示了如何使用 __add__ 方法:

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):if isinstance(other, Vector):return Vector(self.x + other.x, self.y + other.y)return NotImplementeddef __repr__(self):return f"Vector({self.x}, {self.y})"# 示例
v1 = Vector(2, 3)
v2 = Vector(4, 5)
result = v1 + v2
print(result)  # 输出: Vector(6, 8)

在这个例子中,Vector 类实现了 __add__ 方法,使得可以直接使用 + 运算符将两个 Vector 对象相加。当 v1 + v2 被调用时,__add__ 方法被执行,返回一个新的 Vector 对象,其坐标是两个向量的坐标相加的结果。 

__radd__(self, other)

__radd__(self, other) 是一个特殊方法,用于定义右加法操作,通常在左侧操作数不支持加法时被调用。它允许你在自定义对象的情况下实现与其他类型的加法。

下面是一个例子,展示了如何使用 __radd__ 方法:

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):if isinstance(other, Vector):return Vector(self.x + other.x, self.y + other.y)return NotImplementeddef __radd__(self, other):# 当其他对象调用 + 时,如果左边的对象不是 Vectorreturn self.__add__(other)def __repr__(self):return f"Vector({self.x}, {self.y})"# 示例
v1 = Vector(2, 3)
v2 = Vector(4, 5)# 正常加法
result1 = v1 + v2
print(result1)  # 输出: Vector(6, 8)# 使用数字与 Vector 相加
result2 = 1 + v1
print(result2)  # 输出: Vector(2, 3)

参考文献

相关文章:

python的特殊方法——魔术方法

前言 __init__(self[]) ​编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的,以两个下划线开头且以两个下划线结尾来命名的方法…...

深入浅出理解TCP三次握手与四次挥手

目录 引言1.为什么需要三次握手?2. 三次握手的过程3. 为什么需要四次挥手?4. 四次挥手的过程5. 为什么挥手需要四次,而握手只需三次?6. 三次握手与四次挥手的时序图7. TIME_WAIT状态的意义8. 总结9.面试时候问到什么是三次握手和四…...

如何在Windows和Linux查看正在监听的端口和绑定的进程

端口(Port)和进程(Process)是计算机网络和操作系统中的重要概念,它们之间有着密切的关系。以下是对这两个概念的详细介绍以及它们之间的关系(附Windows和Linux查看端口和进程的命令): 端口(Por…...

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…...

基于opencv答题卡识别判卷

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色:深度实…...

ShardingSphere分库分表产品介绍

目录 一、ShardingSphere分库分表产品介绍 二、客户端分库分表与服务端分库分表 1、ShardingJDBC客户端分库分表 2、ShardingProxy服务端分库分表 3、ShardingSphere混合部署架构 三、分库分表,能不分就不分! 1、为什么要分库分表? 2、…...

Java经典面试题-多线程打印

threadsynchronized 就好像一个圆圈,A->B->C->A。。。。。 synchronized能够保证多个线程进入实,只用一个线程能进入。 /**多线程交替打印* */ public class Task {private final Object lock new Object();private int count 0;public st…...

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…...

Sollong手机——一站式Web3生态解决方案

从定义上讲,Web3公司也属于互联网公司,不过与传统互联网公司相比,他们有一个很明显的特征:他们不断尝试做去中心化的事,一步步将数据和金融的控制权从美联储(央行和金融机构)、苹果(…...

《重生到现代之从零开始的数据结构生活》—— 顺序表1

线性表 线性表:是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表有顺序表、链表、栈、队列、字符串等等 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连…...

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及,我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效,并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一,以GPT为代表的大模型应用一经推出在短…...

【JDK17 | 1】Java 17 深入剖析:新特性与变革

引言 Java 17 是 Oracle 发布的一个重要版本,它不仅是一个长期支持(LTS)版本,还引入了许多新的特性和改进,为开发者提供了更强大的工具和更优雅的编程体验。在本专栏的文章中,我们将对 Java 17 的新特性进行深入剖析,帮助开发者更好地理解和利用这一版本。 1. 新特性概述…...

strtok

strtok函数原型 char *strtok(conset char *str,conset char *dst); 功能: 将字符串分割成一个一个片段 当strtok()在参数str的字符串中发现参数dst中包含的分割字符时,则会将该字符改为\0字符 当连续出现…...

零信任身份安全的基本原则

零信任身份安全的核心原则就是 “持续验证,永不信任”。可以通过以下6个方面理解: 对“谁”和“什么”进行认证和授权 在零信任身份安全模型中,对用户和设备的身份进行认证和授权是至关重要的。认证是确认用户或设备是其所宣称的身份的过程…...

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…...

手动降级wsl中的numpy

下载完pytorch之后想验证一下cuda好不好使&#xff0c;在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低&#xff0c;numpy太高&#xff0c;所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…...

极客兔兔Gee-Cache Day7

protobuf配置&#xff1a; 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本&#xff0c;则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf&#xff0c;还需要protoc-g…...

R包:APAlyzer从RNA-seq数据计算APA表达丰度

文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具&#xff0c;它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…...

YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…...

dayu_widgets-简介

前言: 越来越多的人开始使用python来做GUI程序&#xff0c;市面上却很少有好的UI控件。即使有也是走的商业收费协议&#xff0c;不敢使用&#xff0c;一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...