Python中Dunder方法 特殊方法__xx__在Python中的运算符重载

dunder方法是python中以双下划线开头和结尾的特殊方法,用于实现类的运算符重载和内置行为。它们让自定义类可以支持如加法、比较、字符串表示等操作,例如\_\_add\_\_实现加法,\_\_eq\_\_和\_\_lt\_\_实现等于和小于比较,\_\_len\_\_实现长度获取。使用时需注意:1. 不要滥用,避免语义不清的操作;2. 保持一致性,如实现\_\_add\_\_的同时考虑\_\_radd\_\_;3. 返回合适类型,通常返回新对象而非修改原对象;4. 符合不可变性预期。可通过dir()函数查看类的dunder方法,帮助调试或学习代码。

在Python中,Dunder方法(也叫“魔术方法”)是以双下划线开头和结尾的方法,比如__init__、__add__等。它们让类可以支持像加法、减法、字符串表示这样的操作。最常见的用途之一就是运算符重载,也就是让自定义对象可以使用像+、-这样的操作符。

什么是Dunder方法?

Dunder是“Double UNDERscore”的缩写,这些方法不是随便写的,而是Python解释器会自动调用的特殊方法。例如:

当你写a + b时,实际上是调用了a.__add__(b)当你打印一个对象时,调用的是它的__str__或__repr__

它们的存在是为了让我们能够为自定义类实现类似内置类型的行为。

如何用Dunder方法实现运算符重载?

如果你想让你的类支持加法、比较、长度获取等功能,就需要实现对应的Dunder方法。下面是一些常用的例子:

立即学习“Python免费学习笔记(深入)”;

加法:__add__

class Point:    def __init__(self, x, y):        self.x = x        self.y = y    def __add__(self, other):        return Point(self.x + other.x, self.y + other.y)

这样就可以这样写:

p1 = Point(1, 2)p2 = Point(3, 4)p3 = p1 + p2  # 实际上调用的是 p1.__add__(p2)

比较:__eq__ 和 __lt__

如果你希望两个对象可以用==或来比较:

def __eq__(self, other):    return self.x == other.x and self.y == other.ydef __lt__(self, other):    return (self.x < other.x) or (self.x == other.x and self.y < other.y)

这样你可以直接写:

p1 == p2p1 < p2

获取长度:__len__

假设你的类有一个可度量的长度,比如一个向量:

def __len__(self):    return int((self.x**2 + self.y**2)**0.5)

然后你可以:

vec = Vector(3, 4)print(len(vec))  # 输出 5

常见问题与注意事项

不要滥用:并不是所有操作都需要重载。比如给一个用户类加上+操作可能让人困惑。保持一致性:如果你实现了__add__,最好也考虑是否需要实现__radd__以支持反向加法。返回合适的类型:比如加法应该返回新的对象而不是修改原对象。注意不可变性:像+操作通常不会改变原对象,这一点要符合预期。

小技巧:如何查看一个类有哪些Dunder方法?

你可以用dir()函数看看某个类或实例有哪些可用的Dunder方法:

dir(Point)

或者只看以双下划线开头的方法:

[m for m in dir(Point) if m.startswith('__') and m.endswith('__')]

这在调试或学习别人的代码时特别有用。

基本上就这些了。Dunder方法看起来高级,但其实只要理解了它们的作用机制,就能很自然地用好它们。关键是在合适的时候用,别为了炫技而用。

以上就是Python中Dunder方法 特殊方法__xx__在Python中的运算符重载的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1362559.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 01:56:14
下一篇 2025年12月14日 01:56:31

相关推荐

  • sublime写完代码怎么运行

    sublime写完代码怎么运行sublime写完代码怎么运行sublime写完代码怎么运行sublime写完代码怎么运行

    在 Sublime Text 中运行代码的方法取决于代码语言,可通过以下方法实现:Python:使用 SublimeREPL 插件或 Cmd/Ctrl + B。JavaScript/Node.js:使用 SublimeREPL 插件或 Cmd/Ctrl + B。其他语言:安装特定插件以获得运行代码功…

    2026年10月2日 • 用户投稿
    000
  • 豆包AI编程助手用法 豆包AI代码编写教程

    豆包AI编程助手用法 豆包AI代码编写教程豆包AI编程助手用法 豆包AI代码编写教程豆包AI编程助手用法 豆包AI代码编写教程豆包AI编程助手用法 豆包AI代码编写教程

    豆包ai编程助手的核心使用方法包括代码补全、错误排查、代码优化和学习辅助。在代码补全时,应明确输入意图并配合注释提示ai生成准确代码;遇到报错可将完整错误信息交给ai分析原因;已有代码可通过ai建议优化为更高效写法;还可用于实时学习语法和库用法。关键在于清晰表达需求以获得有效帮助。 ☞☞☞AI 智能…

    2026年10月2日 • 用户投稿
    100
  • 用豆包AI生成Python文本分析代码

    用豆包AI生成Python文本分析代码用豆包AI生成Python文本分析代码用豆包AI生成Python文本分析代码用豆包AI生成Python文本分析代码

    想用豆包ai写python文本分析代码的关键在于给出清晰指令。1. 首先明确分析内容,如处理中英文、分词、词频统计或情感分析,并具体说明是否去停用词等细节;2. 可让豆包推荐适用库和结构,如jieba、collections.counter、re或textblob,并提供基本代码框架;3. 也可直接…

    2026年10月2日 • 用户投稿
    100
  • sublime如何调用input函数

    sublime如何调用input函数sublime如何调用input函数sublime如何调用input函数sublime如何调用input函数

    在 Sublime Text 中调用 input() 函数:安装 Python 插件。在 Python 文件中使用语法 “user_input = input(“提示信息:”)” 调用 input() 函数,其中 “提示信息” …

    2026年10月2日 • 用户投稿
    100
  • sublime如何运行代码没反应

    sublime如何运行代码没反应sublime如何运行代码没反应sublime如何运行代码没反应sublime如何运行代码没反应

    代码在 Sublime 中无响应的原因可能是代码语法错误、缺少依赖项、配置错误、系统资源不足或网络连接问题。解决方案包括检查语法、安装依赖项、检查配置、检查系统资源、检查网络连接、重启 Sublime、使用调试器或寻求帮助。 Sublime 中代码无响应:原因和解决方案 Sublime Text 是…

    2026年10月2日 • 用户投稿
    200
  • sublime怎么运行代码快捷键

    sublime怎么运行代码快捷键sublime怎么运行代码快捷键sublime怎么运行代码快捷键sublime怎么运行代码快捷键

    Sublime 中运行代码的快捷键为 Ctrl + B(Windows/Linux)或 Cmd + B(macOS)。此快捷键执行下列操作:搜索并执行当前文件中的指定命令(如果有)。尝试在所有文件中搜索命令,并在找到后执行。允许自定义特定语言或文件的运行命令。 Sublime 中运行代码的快捷键 快…

    2026年10月2日 • 用户投稿
    200
  • Js处理滚动条和日期框

    Js处理滚动条和日期框Js处理滚动条和日期框Js处理滚动条和日期框Js处理滚动条和日期框

    文章总览图 此思维导图中的语法要结合文章内容来看,切记不可死读书,要活学活用。 Js处理1.常用的元素基本操作是什么? 四个基本操作。 1.send_keys() 2.click() 3.获取元素的文本内容。 4.获取元素的属性。 find_element_by_xpath()是我们的元素对象。 .…

    2026年10月2日 • 用户投稿
    200
  • sublime是干嘛的 sublime是什么软件

    sublime是干嘛的 sublime是什么软件sublime是干嘛的 sublime是什么软件sublime是干嘛的 sublime是什么软件sublime是干嘛的 sublime是什么软件

    Sublime Text 是一款跨平台代码编辑器,以其速度、可定制性和优雅界面著称。其核心优势包括:强大的插件生态系统,可扩展到各种编程语言和任务。丰富快捷键,提升编码效率。对多种编程语言提供语法高亮和代码自动补全。虽然Sublime Text 并非免费,也缺乏强大的调试功能,但它是一款轻巧灵活的代…

    2026年10月2日 • 用户投稿
    100
  • sublime是不是免费的

    sublime是不是免费的sublime是不是免费的sublime是不是免费的sublime是不是免费的

    Sublime Text 是一个免费试用但非完全免费的代码编辑器。其核心功能免费使用,但鼓励用户购买许可证支持开发者。它提供轻量、快速和高度可定制的编辑体验,可以通过安装插件扩展其功能。 Sublime Text 是免费试用,但不是完全免费的。 先准备好你的开发环境,确保你的电脑已经安装了操作系统和…

    2026年10月2日 • 用户投稿
    200
  • SublimeText快捷键实现代码注释与取消注释

    SublimeText快捷键实现代码注释与取消注释SublimeText快捷键实现代码注释与取消注释SublimeText快捷键实现代码注释与取消注释SublimeText快捷键实现代码注释与取消注释

    在sublime text中,使用快捷键注释和取消注释代码的方法是:1. windows/linux使用ctrl + /,2. macos使用cmd + /。这些快捷键适用于单行和多行注释,提升了开发效率。 引言 在这个快节奏的编程世界中,效率就是一切。Sublime Text,作为一款深受开发者喜…

    2026年10月2日 • 用户投稿
    100
  • MySQL分区表中文乱码的特殊处理方式分享

    mysql分区表出现中文乱码的根本原因是字符集配置不当,而非分区本身导致。1. 首先要确保数据库、表和字段的字符集为utf8mb4,建库建表时显式指定,并可通过alter语句修改已有对象的字符集,同时注意检查字段级别的字符集是否同步更新。2. 连接层需统一设置为utf8mb4,通过set names…

    2026年10月2日
    200
  • SublimeText配置Python3.11开发环境的详细步骤

    SublimeText配置Python3.11开发环境的详细步骤SublimeText配置Python3.11开发环境的详细步骤SublimeText配置Python3.11开发环境的详细步骤SublimeText配置Python3.11开发环境的详细步骤

    配置sublimetext为python3.11开发环境的步骤如下:1.安装package control,通过粘贴代码到控制台并重启sublimetext。2.安装anaconda和python improved插件,增强python开发功能。3.在用户设置中配置python解释器路径。4.安装并…

    2026年10月2日 • 用户投稿
    100
  • 怎么让豆包AI生成Python环境配置脚本

    怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本

    想让豆包ai生成python环境配置脚本,首先要明确需求:操作系统、python版本、是否需要虚拟环境及具体依赖库和版本。1. 提前确定系统如ubuntu或macos;2. 指定python版本如3.10;3. 说明是否使用venv或conda;4. 列出所需库及版本如flask==2.3.0;5.…

    2026年10月2日 • 用户投稿
    100
  • 禁用SublimeText插件以提升性能的操作步骤

    禁用SublimeText插件以提升性能的操作步骤禁用SublimeText插件以提升性能的操作步骤禁用SublimeText插件以提升性能的操作步骤禁用SublimeText插件以提升性能的操作步骤

    禁用sublimetext插件可以提升编辑器性能。具体步骤是:1. 打开包管理器(ctrl+shift+p/windows/linux或cmd+shift+p/mac),输入并选择“package control: disable package”。2. 从列表中选择并禁用不常用插件。3. 重启su…

    2026年10月2日 • 用户投稿
    100
  • 怎么让豆包AI生成Python数据库连接代码

    怎么让豆包AI生成Python数据库连接代码怎么让豆包AI生成Python数据库连接代码怎么让豆包AI生成Python数据库连接代码怎么让豆包AI生成Python数据库连接代码

    想让豆包ai生成python连接数据库的代码,关键在于清楚表达需求。1. 明确数据库类型(如mysql、postgresql、sqlite)及是否使用orm框架(如sqlalchemy)。2. 提供必要参数信息,包括host、user、password、database等字段。3. 可要求加入异常处…

    2026年10月2日 • 用户投稿
    200
  • 如何让豆包AI实现Python数据清洗

    如何让豆包AI实现Python数据清洗如何让豆包AI实现Python数据清洗如何让豆包AI实现Python数据清洗如何让豆包AI实现Python数据清洗

    豆包ai虽不如专业python库强大,但在数据清洗中可辅助理解思路与方法。1. 可通过对话理清清洗流程,如检查缺失值、去重、标准化格式等;2. 能生成基础代码模板,如读取csv并删除空值;3. 可解释错误信息,如keyerror原因及排查方向;4. 能辅助编写自动化脚本逻辑,如定时任务设置。总体而言…

    2026年10月2日 • 用户投稿
    100
  • 如何让豆包AI编写Python日志记录功能

    如何让豆包AI编写Python日志记录功能如何让豆包AI编写Python日志记录功能如何让豆包AI编写Python日志记录功能如何让豆包AI编写Python日志记录功能

    要让豆包ai写出实用的python日志功能,关键在于明确需求并结构化提问。首先需说明日志输出位置(如控制台或文件)、格式要求(如时间戳、级别、模块名)、日志级别(如info及以上)以及是否需要按天或大小分割日志;例如可提问:“请用logging模块写一个函数,1. 输出到控制台和app.log;2.…

    2026年10月2日 • 用户投稿
    100
  • 处理大文件(超 10MB)时的卡顿优化方案

    处理大文件(超 10MB)时的卡顿优化方案处理大文件(超 10MB)时的卡顿优化方案处理大文件(超 10MB)时的卡顿优化方案处理大文件(超 10MB)时的卡顿优化方案

    处理大文件卡顿时,核心解决方案是分片读取、异步处理和使用流式api。1. 分片读取:按行或按块(如几kb到几mb)逐步加载文件内容,避免内存过载;2. 异步处理:将耗时操作移至后台线程或进程,防止阻塞主线程,保持界面流畅;3. 使用流式api:借助node.js的stream、python的io等模…

    2026年10月2日 • 用户投稿
    200
  • 插件更新后导致 Sublime Text 崩溃的回滚方法

    插件更新后导致 Sublime Text 崩溃的回滚方法插件更新后导致 Sublime Text 崩溃的回滚方法插件更新后导致 Sublime Text 崩溃的回滚方法插件更新后导致 Sublime Text 崩溃的回滚方法

    sublime text因插件更新崩溃的解决方法是:先以安全模式启动定位问题插件,再通过逐个启用排查并降级或卸载问题插件。1. 以安全模式启动(按住shift/option键),若正常则问题由插件引起;2. 逐个启用插件测试,锁定导致崩溃的具体插件;3. 对问题插件选择降级安装旧版或彻底卸载;4. …

    2026年10月2日 • 用户投稿
    100
  • 多语言开发场景下的插件组合推荐

    多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐

    多语言开发效率提升的关键在于根据需求选择合适的插件组合。推荐如下:1. 代码编辑器/ide 插件:vs code 可选用 pylance、eslint 等语言支持类插件,intellij idea 对 java/kotlin 原生支持良好并兼容其他语言;2. 翻译类插件如彩云小译和 code tra…

    2026年10月2日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信