Python魔法函数(Magic Methods简介

在 Python 中,魔法函数(Magic Methods)也称为双下划线方法(Dunder Methods),是指那些名字以双下划线开头和结尾的特殊方法。 这些方法可以让您的自定义类实现一些特定的行为,从而与 Python 的内置类型和操作进行交互。

例如,`__init__` 方法用于对象的初始化,`__str__` 方法用于定义对象的字符串表示形式,`__add__` 方法用于实现对象的加法操作等。

以下是一些常见魔法函数的示例及其作用:

1. `__init__`:在创建对象时自动调用,用于初始化对象的属性。 

class MyClass:def __init__(self, value):self.value = value

 例子:创建“Student”类,对应逻辑关系:

Student→self→{name,age,grade}(三个逻辑分支)

# 创建学生对象
student1 = Student("Alice", 12, 6)
#类的实例化
class Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = grade# 创建学生对象
student1 = Student("Alice", 12, 6)
print(student1.name)  
print(student1.age)  
print(student1.grade)  

 

2. `__str__`:定义对象的字符串表示,当使用 `str()` 函数或在打印对象时调用。

class MyClass:def __str__(self):return f"MyClass with value: {self.value}"

例子:

class MyClass:def __init__(self, value):self.value = valuedef __str__(self):return f"My value is {self.value}"my_object = MyClass(42)
print(str(my_object))  

在这段代码中,`42` 这个值的传递关系如下: 当创建对象 `my_object = MyClass(42)` 时,`42` 作为参数被传递给了 `MyClass` 类的 `__init__` 方法。 在 `__init__` 方法内部,`42` 被赋值给了对象的 `self.value` 属性,使得该对象具有了 `value` 属性且其值为 `42` 。 当执行 `str(my_object)` 或 `print(my_object)` 时,会调用 `__str__` 方法,在 `__str__` 方法中通过 `self.value` 访问到了之前存储的 `42` 值,并将其用于生成返回的字符串 `My value is 42` 。 简单来说,`42` 从创建对象时作为参数传入,被存储在对象的属性中,然后在需要时被 `__str__` 方法获取并使用。  

3. `__add__`:实现对象的加法操作。

class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)

例子:

class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.num)  

 

4. `__len__`:用于 `len()` 函数获取对象的长度。

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)

例子:

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

通过合理地定义魔法函数,可以使自定义类的行为更加自然和符合 Python 的习惯用法。

以下是一些常见的 Python 魔法函数及它们的作用:

1. `__init__(self,...)`:对象初始化函数,在创建对象时调用,用于进行对象的初始化操作。

2. `__str__(self)`:直接打印对象的实现方法,被`print`函数调用,返回对象的字符串表示。

3. `__new__(cls, *args, **kwargs)`:在对象实例化时首先被调用,用于创建并返回实例对象。

4. `__unicode__(self)`:在一个对象上调用`unicode()`时被调用,常用于 Django 模型中处理字符串。

5. `__call__(self, *args, **kwargs)`:允许一个类的实例像函数一样被调用。

6. `__len__(self)`:定义当被`len()`调用时的行为,需要返回一个整数,表示对象的长度。

7. `__repr__(self)`:用于将值转化为供解释器读取的形式,如果对象没有适于人阅读的解释形式,`str()`会返回与`repr()`相同的内容。

8. `__setattr__(self, name, value)`:可以设置对象的属性。

9. `__getattr__(self, name)`:获取对象属性,在属性没有找到时被调用。

10. `__getattribute__(self, name)`:无条件地获取对象属性,可用于做一些控制,但定义后`__getattr__`不再自动调用,除非显式调用。

11. `__delattr__(self, name)`:用于删除对象的属性。

12. `__setitem__(self, key, value)`:实现该函数后,可以以下标的方式给对象赋值。

13. `__getitem__(self, key)`:可以使对象支持以下标的方式获取值。

14. `__delitem__(self, key)`:支持以下标方式删除对象数据。

15. `__iter__(self)`:只要定义了该方法,对象就可以使用迭代器访问,意味着可以迭代自定义的对象。

16. `__del__(self)`:析构器或回收器,在对象引用数降到 0 时执行,但执行时间可能不确定,一般不推荐使用,可用于实现一些非紧急但必须要做的事。

17. `__eq__(self, other)`:定义等于号的行为,用于判断两个对象是否相等。

18. `__lt__(self, other)`:定义小于号的行为,用于判断一个对象是否小于另一个对象。

19. `__gt__(self, other)`:定义大于号的行为,用于判断一个对象是否大于另一个对象。

20. `__add__(self, other)`:定义加法操作的行为。

21. `__sub__(self, other)`:定义减法操作的行为。

22. `__mul__(self, other)`:定义乘法操作的行为。

23. `__truediv__(self, other)`:定义真除法操作的行为。

24. `__floordiv__(self, other)`:定义整数除法操作的行为。

25. `__mod__(self, other)`:定义取模算法的行为。

26. `__pow__(self, other, modulo)`:定义当被`power()`调用或 `**` 运算时的行为。

27. `__radd__(self, other)`等(反运算魔法方法):当左操作数不支持相应的操作时被调用,例如`__radd__`在执行`other + self`时被调用。

28. `__iadd__(self, other)`等(增量赋值运算魔法方法):定义相应的增量赋值运算行为,如`__iadd__`定义`+=`的行为。

29. `__neg__(self)`:定义正号的行为。

30. `__pos__(self)`:定义负号的行为。

31. `__abs__(self)`:定义当被`abs()`调用时的行为。

32. `__invert__(self)`:定义按位求反的行为。

33. `__complex__(self)`:定义当被`complex()`调用时的行为,需要返回恰当的值。

34. `__int__(self)`:定义当被`int()`调用时的行为,需要返回恰当的值。

35. `__float__(self)`:定义当被`float()`调用时的行为,需要返回恰当的值。

36. `__round__(self, n)`:定义当被`round()`调用时的行为,需要返回恰当的值。

37. `__index__(self)`:当对象应用在切片表达式中时,实现强制转换;如果定义了该方法,则也需要定义`__int__`且返回相同的值。

魔法函数可以让自定义类具有更丰富的行为,类似于 Python 内置类型的操作方式,从而使代码更加简洁、易读和可维护。它们的具体使用方式和效果取决于具体的需求和上下文。在实际编程中,根据需要选择合适的魔法函数来定制类的行为。

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

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

相关文章

绝区肆--2024 年AI安全状况

前言 随着人工智能系统变得越来越强大和普及,与之相关的安全问题也越来越多。让我们来看看 2024 年人工智能安全的现状——评估威胁、分析漏洞、审查有前景的防御策略,并推测这一关键领域的未来可能如何。 主要的人工智能安全威胁 人工智能系统和应用程…

Qt 绘图详解

文章目录 头文件和构造函数启用反锯齿功能绘制矩形绘制圆角矩形绘制椭圆绘制圆弧绘制弦绘制凸多边形绘制图片绘制直线绘制多条直线绘制多点连接的线绘制路径绘制扇形绘制点绘制文本擦除矩形区域填充矩形填充路径 头文件和构造函数 #include "mainwindow.h" #include…

C-11 三角剖分的调研

C-11 三角剖分算法 三角剖分就是将输入的多边形,分割成一系列互不重叠的三角形,其重要性就在这不多赘述。这个是一个别人总结的链接:http://vterrain.org/Implementation/Libs/triangulate.html 图片链接:http://www-cgrl.cs.m…

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…

springboot校园安全通事件报告小程序-计算机毕业设计源码02445

Springboot 校园安全通事件报告小程序系统 摘 要 随着中国经济的飞速增长,消费者的智能化水平不断提高,许多智能手机和相关的软件正在得到更多的关注和支持。其中,校园安全通事件报告小程序系统更是深得消费者的喜爱,它的出现极大…

关于隐藏、覆盖(重写)、重载的理解

定义区分 在派生-对象中:优先考虑隐藏,此时派生类中的覆盖(重写)也是隐藏;没有隐藏的情况下,子类对象才能调用父类重载函数。[此时感觉virtual没用,]在派生-指针或者引用中:只用覆盖(重写)和重载; 注:C Pr…

《Programming from the Ground Up》阅读笔记:p19-p48

《Programming from the Ground Up》学习第2天,p19-p48总结,总计30页。 一、技术总结 1.object file p20, An object file is code that is in the machine’s language, but has not been completely put together。 之前在很多地方都看到object fi…

高阶K8S面试题你会几个?

前言 K8S架构、公有云、持久化存储、HELM、CICD、负载均衡、监控告警、可观察性、服务治理、架构探索。。。 Q1:如何调试 Kubernetes 集群中的网络连接问题,比如 Pod 间通信失败的情况? 状态检查:使用 kubectl get pods 和 kube…

MySQL-17-mysql alter 语句如何实现?如何合并为一个

拓展阅读 MySQL 00 View MySQL 01 Ruler mysql 日常开发规范 MySQL 02 truncate table 与 delete 清空表的区别和坑 MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column MySQL 04 EMOJI 表情与 UTF8MB4 的故事 MySQL 05 MySQL入门教程&a…

Git使用中遇到的问题(随时更新)

问题1.先创建本地库,后拉取远程仓库时上传失败的问题怎么解决? 操作主要步骤: step1 设置远程仓库地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到远程仓库: $ git push -u origin "master&qu…

线程池理解及7个参数

定义理解 线程池其实是一种池化的技术实现,池化技术的核心思想就是实现资源的复用,避免资源的重复创建和销毁带来的性能开销。线程池可以管理一堆线程,让线程执行完任务之后不进行销毁,而是继续去处理其它线程已经提交的任务。 …

GStreamer学习5----probe数据探测

参考资料: gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客 Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。 在GStreamer中,probe…

LayerNorm Plugin的使用与说明

目录 前言0. 简述1. Layernorm Plugin的使用1.1 源码下载1.2 模型下载和修改1.3 环境配置1.4 编译1.4 engine生成和执行(trtexec)1.5 enging生成和执行(C API) 2. 补充说明2.1 RTMO显存占用问题2.2 插件找不到的说明2.3 LayerNorm plugin封装的尝试2.4 layerNorm plugin核函数实…

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率(p)是一个衡量拉曼散射光偏振状态的参数,它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率(p&…

禁用windows的语音识别快捷键win+ctrl+s

win11组合键winctrls会弹出语音识别提示,即使到设置里禁用了语音识别也没用 解决办法:安装PowerToys,通过“键盘管理器”-“重新映射快捷键”禁用 PowerToys是微软自己的工具,不用担心安全问题,下载地址:h…

系统设计题-简易数据库系统

一、设计一个简易数据库系统,包含create,insert,select三个指令。 create(int tableId,int colNum,String key):创建表,其id为tableId,如果该表已存在,则不做任何处理。colNum为表中列的数量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

题意 有一张 n n n 点 ( m 1 m 2 ) (m_1m_2) (m1​m2​) 边的无向图,其中 m 1 m_1 m1​ 条为无向边,另外 m 2 m_2 m2​ 条为有向边, 无向边的边权可以为负。求 s s s 到其他每个点的最短路。 思路 使用 SPFA 会 T 掉一两个点&#x…

第10章:网络与信息安全

目录 第10章:网络与信息安全 网络概述 计算机网络概念 计算机网络的分类 网络的拓扑结构 ISO/OSI网络体系结构 网络互联硬件 物理层互联设备 数据链路层互联设备 网络层互联设备 应用层互联设备 网络的协议与标准 网络标准 TCP/IP协议族 网络接口层协…

GCC扩展功能、函数,预处理命令

文章目录 前言一、GCC C语言扩展声明函数属性变量属性内敛汇编与原子操作相关的内建函数内存模型感知原子操作的内置函数使用溢出检查执行算术的内置函数 - xxx 二、GCC C语言扩展interface和 pragmasTemplate 二、预处理过程及其指令预处理过程1. 字符集转换2. Initial proces…

实现基于Spring Cloud的事件驱动微服务

实现基于Spring Cloud的事件驱动微服务 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 事件驱动架构在现代微服务架构中越来越受欢迎,它通过事件的…