12个Python开发者必知必会的魔术方法

news2025/1/21 15:29:29

e91725d78323f52546bffc2aa729d216.jpeg

更多Python学习内容:ipengtao.com

Python中的魔术方法(Magic Methods)是一组特殊的方法,它们以双下划线开头和结尾,例如__init____str__。这些方法可以定义自定义类的行为,使对象可以与Python的内置功能(例如lenstr+等)协作。本文将介绍12个Python开发者必知必会的魔术方法,以及如何使用它们来定制类。

1. __init__

__init__方法是类的构造方法,在创建类的实例时自动调用。它用于初始化对象的属性。

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

obj = MyClass(42)
print(obj.value)  # 输出 42

2. __str__

__str__方法用于返回对象的字符串表示。当调用str(obj)时,它将调用对象的__str__方法。

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

obj = MyClass(42)
print(str(obj))  # 输出 "MyClass with value 42"

3. __repr__

__repr__方法用于返回对象的“官方”字符串表示,通常是一个可以用来重新创建对象的表达式。当在交互式环境中直接输入对象名时,它将调用对象的__repr__方法。

class MyClass:
    def __init__(self, value):
        self.value = value
    
    def __repr__(self):
        return f"MyClass({self.value})"

obj = MyClass(42)
print(obj)  # 输出 "MyClass(42)"

4. __len__

__len__方法用于返回对象的长度,通常与内置函数len一起使用。

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

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

5. __getitem____setitem__

__getitem__方法用于获取对象的元素,__setitem__方法用于设置对象的元素。这使得类可以像列表或字典一样操作。

class MyList:
    def __init__(self, data):
        self.data = data
    
    def __getitem__(self, index):
        return self.data[index]
    
    def __setitem__(self, index, value):
        self.data[index] = value

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

6. __iter____next__

__iter__方法返回一个可迭代对象,__next__方法用于获取下一个元素。这使得类可以支持迭代。

class MyRange:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current < self.limit:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration

my_range = MyRange(5)
for num in my_range:
    print(num)  # 输出 0 1 2 3 4

7. __contains__

__contains__方法用于检查对象是否包含某个值。它通常与in操作符一起使用。

class MyList:
    def __init__(self, data):
        self.data = data
    
    def __contains__(self, item):
        return item in self.data

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

8. __eq__

__eq__方法用于定义对象之间的相等性。它通常与==操作符一起使用。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __eq__(self, other):
        if isinstance(other, Point):
            return self.x == other.x and self.y == other.y
        return False

p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)  # 输出 True

9. __lt__, __le__, __gt__, __ge__

这些方法分别用于定义对象之间的小于、小于或等于、大于和大于或等于关系。它们通常与比较操作符(例如<<=>>=)一起使用。

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def __lt__(self, other):
        return self.width * self.height < other.width * other.height
    
    def __le__(self, other):
        return self.width * self.height <= other.width * other.height
    
    def __gt__(self, other):
        return self.width * self.height > other.width * other.height
    
    def __ge__(self, other):
        return self.width * self.height >= other.width * other.height

rect1 = Rectangle(3, 4)
rect2 = Rectangle(2, 6)
print(rect1 < rect2)   # 输出 True
print(rect1 <= rect2)  # 输出 True
print(rect1 > rect2)   # 输出 False
print(rect1 >= rect2)  # 输出 False

10. __add__

__add__方法用于定义对象之间的加法操作。它通常与+操作符一起使用。

class ComplexNumber:
    def __init__(self, real, imaginary):
        self.real = real
        self.imaginary = imaginary
    
    def __add__(self, other):
        return ComplexNumber(self.real + other.real, self.imaginary + other.imaginary)

c1 = ComplexNumber(1, 2)
c2 = ComplexNumber(2, 3)
result = c1 + c2
print(result.real, "+", result.imaginary, "i")  # 输出 3 + 5 i

11. __sub__

__sub__方法用于定义对象之间的减法操作。它通常与-操作符一起使用。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)

v1 = Vector(1, 2)
v2 = Vector(2, 3)
result = v1 - v2
print(result.x, result.y)  # 输出 -1 -1

12. __call__

__call__方法可以将对象作为函数调用。这意味着可以像函数一样调用对象,并在类中定义其行为。

class MyFunction:
    def __call__(self, *args):
        return sum(args)

add = MyFunction()
result = add(1, 2, 3, 4, 5)
print(result)  # 输出 15

结论

魔术方法是Python中非常强大和灵活的功能之一,它们可以自定义类的行为,使代码更具可读性和可维护性。本文介绍了12个常用的魔术方法,包括__init____str____repr____len____getitem____setitem____iter____next____contains____eq____lt__等等。通过熟练掌握这些魔术方法,可以更好地利用Python的强大功能,编写出更具表现力和功能性的自定义类。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

9bfcb6c3dd29dfa76911a6820262b83c.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

固定本机在局域网中的 IP 地址

说明&#xff1a;以将 IP 地址固定为 192.168.1.107 为例 Step1、打开终端&#xff0c;输入以下命令查看网络信息&#xff1a; ipconfig -all 记住子网掩码、默认网关、DNS 服务器&#xff08;首选和备用&#xff09;信息&#xff0c;后面要用&#xff1a; Step2、进入 “控制…

AI产品经理 - 如何做一款软硬协同AI产品

【背景】从0做一款软硬协同的AI产品&#xff0c;以智能医药保温箱 1.以智能医药保温箱 2.调研定义市场方向 地点&#xff1a;医药、实验室 场景&#xff1a;长宽高/装箱/运输/实验室 3.需求挖掘 4.如何进行软硬件AI产品工作 软硬件产品设计&#xff1a;功能/硬件外观设计、…

nodejs+vue+微信小程序+python+PHP技术的健康信息网站-计算机毕业设计推荐

3.2 功能性需求分析 健康信息网站为会员提供健康信息服务的系统&#xff0c;管理员通过登录系统&#xff0c;管理会员信息、健康咨询、健康知识、健康档案、健康养生、健康信息的搜索、健康资讯等。需要学习的会员浏览健康信息网站&#xff0c;查询所有的健康信息&#xff0c;可…

基于PHP的校园代购商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园代购商城系统 一 介绍 此校园代购商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 …

鸿蒙开发中的一些小问题

这是我在学习鸿蒙开发中遇见的小问题 Q1&#xff1a;This custom component must have a build function. <etsLint>Q2&#xff1a;page_title is not translated into en_US(American English)Q3&#xff1a;Module "../CustomComponent/CustomButton" declar…

2023-12-25 LeetCode每日一题(不浪费原料的汉堡制作方案)

2023-12-25每日一题 一、题目编号 1276. 不浪费原料的汉堡制作方案二、题目链接 点击跳转到题目位置 三、题目描述 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices …

机器学习:贝叶斯估计在新闻分类任务中的应用

文章摘要 随着互联网的普及和发展&#xff0c;大量的新闻信息涌入我们的生活。然而&#xff0c;这些新闻信息的质量参差不齐&#xff0c;有些甚至包含虚假或误导性的内容。因此&#xff0c;对新闻进行有效的分类和筛选&#xff0c;以便用户能够快速获取真实、有价值的信息&…

2024年原创深度学习算法项目分享

原创深度学习算法项目分享&#xff0c;包括以下领域&#xff1a; 图像视频、文本分析、知识图谱、推荐系统、问答系统、强化学习、机器学习、多模态、系统界面、爬虫、增量学习等领域… 有需要的话&#xff0c;评论区私聊

2023-12-14 LeetCode每日一题(用邮票贴满网格图)

2023-12-14每日一题 一、题目编号 2132. 用邮票贴满网格图二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stam…

回顾2023,我的编程学习之旅

文章目录 前言我与C语言初识C语言简易扫雷游戏二进制的美妙神奇的指针强大的结构体灵活的动态内存管理总结 我与竞赛我与CSDN结语 前言 6月8号高考结束了&#xff0c;虽然还没有出分&#xff0c;但是也大致规划好自己想学什么专业了&#xff0c;没错就是计算机&#xff0c;出分…

常见推断方法一览:极大似然估计、最大后验估计、期望最大化、贝叶斯推断、马尔科夫链蒙特卡洛方法、变分推断

常见推断方法一览 推断方法区别频率派极大似然估计 MLE最大后验估计 MAP期望最大化 EM 贝叶斯推断 Bayesian马尔科夫链蒙特卡洛方法 MCMC变分推断 VI 推断方法区别 极大似然估计 (Maximum Likelihood Estimation, MLE): 解释: 假设你有一堆骰子&#xff0c;你投掷它们很多次&am…

Vue中目录以及文件内容简单分析

src文件下目录分析&#xff1a; App.vue文件中内容&#xff1a; vue文件中基本的三个结构&#xff0c;template&#xff08;结构&#xff09;、script&#xff08;行为&#xff09; 、style&#xff08;样式&#xff09;。 <template><!-- html结构 --><div cl…

Linux xxd命令分析视频文件Box教程(box分析box、视频box、分析atom分析)(xdd指令)

文章目录 Linux xxd命令分析视频文件Box教程一、理解MP4格式二、xxd命令简介三、使用xxd命令分析MP4文件四、解析MP4文件的疑难点1. Box的嵌套结构2. 长度和类型字段的字节序3. 非文本类型的数据 五、python代码解析box嵌套结构的示例 Linux xxd命令分析视频文件Box教程 本文主…

静物摄影在UE5里运用几点记要

被摄体&#xff0c;相机与光源的关系&#xff0c;要增强立体感&#xff0c;摄像机与光源的位置关系要错开&#xff1b;b的立体感要更强 漫反射与点光源&#xff0c;UE5太阳光属于漫反射&#xff0c;整体比较柔和&#xff0c;但是阴影处比较黑&#xff1b;摄影棚会用反光板来增亮…

计算机网络技术概述 习题答案及解析

1-1 因特网的前身是 1969 年创建的第一个分组交换网&#xff08; D &#xff09;。 A. internet B. Internet C. NSFNET D. ARPANET 【答案】D 1-2 因特网上的数据交换方式是&#xff08; C &#xff09;。 A. 电路交换 B. 报文交换 C. 分组交换 D…

ES应用_ES实战

依靠知识库使用es总结一些使用技巧。 1 快速入门 ES是将查询语句写成类似json的形式&#xff0c;通过关键字进行查询和调用。 1.1 创建 下面创建了一个主分片为5&#xff0c;副本分片为1的ES结构。ES本身是一种noschema的结构&#xff0c;但是可以通过指定mapping编程schema的…

Unity关于动画混合树(Blend Tree)的使用

在动画与动画的切换过程中&#xff0c;常因为两个动画之间的差距过大&#xff0c;而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起&#xff0c;例如在处理角色的移动中&#xff0c;走动画与跑动画切换的时候&#x…

Vue2 - Vue.observable 介绍

目录 1&#xff0c;介绍2&#xff0c;使用场景和 Vue 实例的区别 1&#xff0c;介绍 官网参考 可以让一个对象变成响应式数据。在 Vue 内部就是用它来处理传递给 Vue 的 data 对象&#xff0c;或是在单文件组件中 data() 返回的对象。 var vm new Vue({data: {count: 0} })…

qs.stringify 使用arrayFormat属性 + allowDots的数据处理 - 附示例

qs&#xff1a;将url中的参数转为对象&#xff1b;将对象转为url参数形式 一、介绍 1、官方文档&#xff1a; https://github.com/ljharb/qs https://github.com/ljharb/qshttps://github.com/ljharb/qs 二、准备工作 1、安装依赖包 npm install qs --save 2、示例版本 &…

Java循环高级(无限循环,break,continue,Random,逢七过,平方根,判断是否是质数,猜数字小游戏)

文章目录 1.无限循环概念&#xff1a;for格式&#xff1a;while格式&#xff1a;do...while格式&#xff1a;无限循环的注意事项&#xff1a; 2.条件控制语句break:continue: 3. Random使用步骤&#xff1a; 4. 逢七过5. 平方根6.判断是否为质数7. 猜数字小游戏 1.无限循环 概…