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好不好使,在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低,numpy太高,所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…...
极客兔兔Gee-Cache Day7
protobuf配置: 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本,则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf,还需要protoc-g…...
R包:APAlyzer从RNA-seq数据计算APA表达丰度
文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具,它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…...
YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性
一、背景 目标检测和实例分割中的关键问题: 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值,这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足: 现有的基于 ℓ n \ell_n ℓn范数的损失函数简单但对各种尺度…...
dayu_widgets-简介
前言: 越来越多的人开始使用python来做GUI程序,市面上却很少有好的UI控件。即使有也是走的商业收费协议,不敢使用,一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
