Python:魔法函数

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

Python 的魔法函数,又称为特殊方法,是 Python 类中定义的一组特殊的方法,具有一些独特的特性和用途。这些方法以双下划线(__)开头和结尾,它们在 Python 编程中扮演着特殊角色。魔法函数不是显式调用的,而是在特定的语境下由 Python 解释器隐式自动调用。它们的触发通常与 Python 中的某些内置行为或操作相对应。

魔法函数的工作原理

  1. 自动触发:魔法函数的调用不是直接进行的。例如,当你对类的实例执行 a + b 操作时,Python 将自动调用该类的 __add__ 方法(如果定义了的话)。
  2. 模仿内置类型:魔法函数可以让自定义对象模仿内置类型的行为。例如,通过实现 __len__ 方法,可以使对象支持 len() 函数;通过实现 __getitem__ 方法,可以使对象支持索引操作,如 obj[key]
  3. 增强灵活性:魔法函数提供了一种方式,可以在不改变语法结构的前提下,为自定义对象添加额外的功能。

常见的魔法函数

1. __init__(self, ...)

  • 功能:构造函数,创建对象时自动调用。
  • 代码

class Example:def __init__(self, value):self.value = value
  • 解读:这段代码定义了一个名为Example的类,并提供了一个构造函数__init__。构造函数接受一个参数value,并将其赋值给对象的value属性。当您创建Example类的实例时,如Example(10),数字10就会被存储在该实例的value属性中。

2. __str__(self)

  • 功能:定义对象的字符串表示,例如用于print()
  • 代码

class Example:def __str__(self):return "这是一个示例对象"
  • 解读:此方法定义了对象的字符串表示。当您打印该对象或在需要字符串表示的地方使用该对象时,例如print(Example()),它将输出字符串"这是一个示例对象"

3. __repr__(self)

  • 功能:定义对象的官方字符串表示。
  • 代码

class Example:def __repr__(self):return 'Example()'
  • 解读:这个方法定义了对象的官方字符串表示,通常用于调试。当您在解释器中直接输入该对象或调用repr()函数时,例如repr(Example()),它将返回字符串'Example()'

4. __len__(self)

  • 功能:定义对象的长度,用于len()函数。
  • 代码

class Example:def __len__(self):return 10
  • 解读:该方法定义了对象的长度。当您调用len()函数获取对象的长度时,如len(Example()),它将返回10

5. __getitem__(self, key)

  • 功能:允许对象使用索引操作,如obj[key]
  • 代码

class Example:def __getitem__(self, key):return key * 2
  • 解读:这个方法允许对象使用索引操作。例如,当您执行Example()[5]时,它将返回10(因为5 * 2 = 10)。

6. __setitem__(self, key, value)

  • 功能:允许对象使用索引赋值,如obj[key] = value
  • 代码

class Example:def __setitem__(self, key, value):print(f"设置索引 {key} 的值为 {value}")
  • 解读:该方法允许对象使用索引赋值。例如,执行Example()[5] = 100时,它将打印设置索引 5 的值为 100

7. __eq__(self, other)

  • 功能:定义等号==的行为。
  • 代码

class Example:def __eq__(self, other):return self.value == other.value
  • 解读:这个方法定义了等号==的行为。当您比较两个对象是否相等时,例如Example(10) == Example(10),它将返回True,因为两个对象的value属性值相同。

8. __add__(self, other)

  • 功能:定义加号+的行为。
  • 代码

class Example:def __add__(self, other):return self.value + other.value
  • 解读:此方法定义了加号+的行为。例如,当您将两个Example对象相加时,如Example(10) + Example(20),它将返回它们value属性值的和,即30

9. __iter__(self) 和 __next__(self)

  • 功能:这两个方法共同使得对象成为迭代器。__iter__返回迭代器本身,__next__返回序列的下一个元素。
  • 代码

class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationelse:self.current -= 1return self.current
  • 解读:这个CountDown类实现了一个倒计时迭代器。初始化时设置开始的计数值。当迭代这个对象时(比如在for循环中),__next__方法会被调用,返回当前值后将其减一,直到计数到0时抛出StopIteration异常来停止迭代。

10. __call__(self, ...)

  • 功能:使得实例能够像函数一样被调用。
  • 代码

class Multiply:def __call__(self, a, b):return a * b
  • 解读:在这个例子中,Multiply类的实例可以被用作函数。当您创建一个Multiply实例并像调用函数那样调用它时,例如Multiply()(5, 3),它会返回两个参数的乘积,这里是15

这些魔法方法允许自定义类更加灵活和强大,使它们的行为更接近Python的内置类型,如字符串、列表等。

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

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

相关文章

今日总结2024/3/30

今日学习了基本数论内容,LCM,GCD以及筛素数 GCD-最大公约数 int gcd(int a,int b){//迭代法 while(b){//要保证a大于b int ta%b; ab; bt; } return a }//辗转相除法int gcd(int a,int b){//递归法return b?gcd(b,a%b):a;//一定要保证a大于b } LCM-最小公倍数 可以套公式LC…

解决WordPress文章的段落首行自动空两格的问题

写文章时&#xff0c;段落首行都会空两格&#xff0c;可是WordPress自带的编辑器却没有考虑到这一点&#xff0c;导致发布的文章首行都是顶格的&#xff0c;看起来很不习惯。 我们通常的解决方法都是在发布文章时把编辑器切换到“文本”模式&#xff0c;然后再在首行手动键入两…

鸿蒙之路由跳转router

router的使用都是基于Entry修饰的组件。 都是基于resources/base/profile/main-page.json中的路由配置来跳转的 router提供下列的几个方法 1.pushUrl -压栈一层盖一层(在鸿蒙中页面栈支持最大数值是32) 2.replaceUrl会替换当前页面&#xff0c;不管是不是同一个页面&#xf…

超声波雷达探测车位及信号处理方法

在APA泊车中用到了超声波雷达,第一次接触,总结研究之。 目录 1. 基于USS的泊车位识别及推荐1.1 基于AVM的泊车位识别1.2 障碍物识别2. 超声波雷达及车位探测信号处理1. 基于USS的泊车位识别及推荐 参考: F-APA车位搜索及障碍物识别控制原理 1.1 基于AVM的泊车位识别 (1)a…

P6学习:解析P6 WBS-工作分解结构的原则

前言 WBS&#xff0c;及Work Breakdown Structure&#xff0c;中文工作分解结构&#xff0c;是总结工作阶段的项目的层次结构分解。 WBS 就像项目的大纲——它将项目分解为特定的可交付成果或阶段。 然后将活动添加到这些层中以创建项目计划的时间表。 WBS 使用流程会有所不…

linux命令之tput

1.tput介绍 linux命令tput是可以在终端中进行文本和颜色的控制和格式化&#xff0c;其是一个非常有用的命令 2.tput用法 命令&#xff1a; man tput 3.样例 3.1.清除屏幕 命令&#xff1a; tput clear [rootelasticsearch ~]# tput clear [rootelasticsearch ~]# 3.2.…

love 2d Lua 俄罗斯方块超详细教程

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/love2d-game.git 一直在找Lua 能快速便捷实现图形界面的软件&#xff0c;找了一堆&#xff0c;终于发现love2d是小而美的原生lua图形界面实现的方式。 并参考相关教程做了一个更详细的&#x…

Https【Linux网络编程】

目录 一、为什么需要https 二、常见加密方法 1、对称加密 2、非对称加密 3、数据指纹 三、选择什么加密方案&#xff1f; 方案一&#xff1a;对称加密&#xff08;&#xff09; 方案二&#xff1a;双方使用非对称加密&#xff08;效率低&#xff09; 方案三&#xff1a…

通过cplusplus网站学习函数用法演示

在我们学习c语言或者c时&#xff0c;总会遇到一些我们熟悉的库函数&#xff0c;这时候就需要我们通过cplusplus网站搜索学习&#xff0c;下面就由我为大家演示一下如何通过这个网站的页面学习函数的使用方法吧&#xff01; atoi - C Reference (cplusplus.com) 我们今天要学习…

vue3全局控制Element plus所有组件的文字大小

项目框架vue-右上角有控制全文的文字大小 实现&#xff1a; 只能控制element组件的文字及输入框等大小变化&#xff0c;如果是自行添加div,text, span之类的控制不了。 配置流程 APP.vue 使用element的provide&#xff0c;包含app <el-config-provider :locale"loca…

SparkSQL基本数据抽象RDD/DataFrame/Dataset介绍[附操作代码]

文章目录 1. SparkSQL1.1 总述1.2 数据格式1.3 转化关系1.3.1 RDD转DataFrame | Dataset1.3.2 DataFrame转Dataset1.3.3 DataFrame | Dataset转RDD1.3.4 Dataset转DataFrame 2. DataFrame 数据导入2.1 准备工作pom.xmllog4j.properties 2.2 RDD转换DataFrame2.2.1 模式12.2.2 模…

设计模式,装修模式,Php代码演示,优缺点,注意事项

装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向一个现有对象添加新的功能或行为&#xff0c;而不改变其原始结构。在 PHP 中&#xff0c;可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…

Android MediaPlayer

MediaPlayer 类是媒体框架最重要的组成部分之一。此类的对象能够获取、解码以及播放音频和视频&#xff0c;而且只需极少量设置。它支持多种不同的媒体源&#xff0c;例如&#xff1a; • 本地资源 • 内部 URI&#xff0c;例如您可能从内容解析器那获取的 URI • 外部网址…

debian12,linux-image-6.6.13+bpo-amd64内核nvidia显卡驱动失效

问题 更新linux内核linux-image-6.6.13bpo-amd64和linux-headers-6.6.13bpo-common后无法进入图形化界面&#xff0c;nvidia驱动版本535.154.05&#xff0c;nvidia官方驱动 日志 /var/log/Xorg.1.log [ 3.834] (--) Log file renamed from "/var/log/Xorg.pid-11…

QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法

前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4&#xff0c;在使用过程中发现&#xff0c;VM虚拟机的鼠标的光标会突然消失&#xff0c;但鼠标其他正常&#xff0c;就是光标不见了&#xff0c;下面是解决办法。 内容 如下图&#xff0c;输入mouse&a…

【智能算法】天鹰优化算法(AO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;L Abualigah等人受到天鹰猎食过程启发&#xff0c;提出了天鹰优化算法&#xff08;Aquila Optimizer&#xff0c;AO&#xff09;。 2.算法原理 2.1算法思想 AO模拟天鹰 4 种不…

Vue系列——数据对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…

表情生成器微信小程序版

1.纯前端输出&#xff0c;无需后台&#xff0c;无需域名&#xff0c;速度杠杠快&#xff01; 2.完美支持微信端和抖音端&#xff1b; 3.双端均支持配置开启流量主广告&#xff0c;包括&#xff1a;激励视频广告、插屏广告、banner广告、原生广告、封面广告等&#xff1b; 4.…

刷题日记——国家名称排序

7.国家名称排序 分析 一开始打算用二维的字符数组来操作&#xff0c;但是数组指针玩不太明白&#xff0c;于是改用结构体&#xff0c;结构体country里面仅一个成员name&#xff08;字符数组&#xff09;&#xff0c;这样就有两种解题方法&#xff1a; 方法一&#xff1a;使用…

SpringBoot 整合Redis第1篇

SpringBoot是一个开发框架&#xff0c;Redis是一个高性能的键值存储数据库&#xff0c; 常用于缓存、会话管理、消息队列等应用场景。 定义 Redis是什么&#xff1f; 它是一个存储层级&#xff0c; 在实际项目中&#xff0c;位于关系数据库之上&#xff0c; 类似Android分为5…