当前位置: 首页 > news >正文

Chapter 26 Python魔术方法

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、什么是魔术方法?
  • 二、常见的魔术方法
    • ① __init__构造方法
    • ② __str__字符串方法
    • ③ __lt__比较方法
    • ④ __le__比较方法
    • ⑤ __eq__比较方法


前言

本章将详细讲解 Python 的魔术方法,包括其定义以及一些常见的具体实现。


本篇文章参考:黑马程序员

一、什么是魔术方法?

①定义
在Python中,魔术方法(也称为特殊方法或双下方法)是以双下划线开始和结束的方法。这些方法提供了对Python内置操作的自定义实现,从而允许用户控制对象的行为。魔术方法通常不直接调用,而是由Python在特定操作中自动调用。

②作用

  • 简化代码
  • 增强对象行为
  • 提供方便的接口
  • 增强可读性和可维护性
  • 实现对象之间的灵活交互

魔术方法是 Python 中强大而灵活的功能,使得自定义类能够与语言中的基本特性和运算符无缝集成。它们不仅提升了代码的可读性和可维护性,还遵循了面向对象编程的原则,为开发人员提供了更多的设计自由。

二、常见的魔术方法

常见的魔术方法:
在这里插入图片描述

① __init__构造方法

class Student:name=None          # 记录学生姓名gender=None        # 记录学生性别age=None           # 记录学生年龄stu_1=Student()
stu_1.name="小明"
stu_1.gender="男"
stu_1.age="15"stu_2=Student()
stu_2.name="小红"
stu_2.gender="女"
stu_2.age="18"

在上面这段代码中,为对象的属性赋值需要依次进行,略显繁琐。

思考:那有没有更加高效的方式能够一行代码就完成呢?Student()这个括号能否像函数(方法)那样,通过传参的形式对属性赋值呢?
答:可以,需要使用__init__()方法。

定义:
在Python中,构造方法是一种特殊的方法,用于初始化对象的属性。构造方法的名称是 __init__()。它在创建对象时自动调用。通过构造方法,可以为新创建的对象设置初始状态或属性值。

作用:

  • 构建类对象的时候会自动运行
  • 构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值

注意事项:

  • 构造方法也是成员方法,不要忘记在参数列表中提供self关键字
  • 在构造方法内定义成员变量,需要使用self关键字
class Student:def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=telprint("Student类创建了一个类对象")stu=Student("小明","18","13426272890")
print(stu.name)
print(stu.age)
print(stu.tel)

输出结果:
Student类创建了一个类对象
小明
18
13426272890

【分析】
在这里插入图片描述
self.name = name这行代码的作用是将参数 name 的值赋给对象的 name 属性,确保每个 Student 对象都有自己的 name。

  • self 是对象的实例,指向当前创建的对象
  • self.name 是对象的属性(实例变量),用于存储学生的名字
  • name 是构造方法的参数,即在创建对象时传入的值

② __str__字符串方法

__str__字符串方法可返回对象的字符串表示,通常用于使用print()函数时。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=telstu=Student("小明","18","13456789021")
print(stu)
print(str(stu))

输出结果:
<main.Student object at 0x000001C3F0FEA030>
<main.Student object at 0x000001C3F0FEA030>

当类的对象被转换为字符串时,通常输出的是内存地址,这样的表示并没有太大意义。为了提供更有用的信息,我们可以通过定义 __str__字符串方法来控制对象在转换为字符串时的行为。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=tel# __str__魔术方法def __str__(self):return f"Student类对象,姓名:{self.name},年龄:{self.age},电话:{self.tel}"stu=Student("小明","18","13456789021")
print(stu)
print(str(stu))

输出结果:
Student类对象,姓名:小明,年龄:18,电话:13456789021
Student类对象,姓名:小明,年龄:18,电话:13456789021

③ __lt__比较方法

__lt__比较方法用于定义小于 (<) 运算符的行为,当你用 a < b 进行比较时,实际上会调用 a __lt__(b),返回一个布尔值 (True 或 False)。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=telstu1=Student("小明","18","13456789021")
stu2=Student("小红","17","13786789021")
print(stu1<stu2)

输出结果:
在这里插入图片描述
直接对两个对象进行比较是不可行的,但如果在类中实现 __lt__方法,就可以使用小于符号进行比较。同时,根据定义的逻辑,也可以实现大于符号的比较。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=tel# __lt__魔术方法def __lt__(self, other):return self.age<other.agestu1=Student("小明","18","13456789021")
stu2=Student("小红","17","13786789021")
print(stu1<stu2)
print(stu1>stu2)

输出结果:
False
True

【分析】
在这里插入图片描述
return self.age < other.age 这行代码执行实际的比较。 self 表示调用该方法的对象实例; other 表示与 self 进行比较的另一个对象实例。如果 self 对象的 age 小于 other对象的 age,那么返回 True;否则返回 False。

④ __le__比较方法

__le__比较方法用于定义小于或等于 (<=) 运算符的行为,你用 a <= b 进行比较时,会调用 a __le__(b),返回一个布尔值 (True 或 False)。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=tel# __le__魔术方法def __le__(self, other):return self.age<=other.agestu1=Student("小明","18","13456789021")
stu2=Student("小红","17","13786789021")
print(stu1<=stu2)
print(stu1>=stu2)

输出结果:
False
True

⑤ __eq__比较方法

__eq__比较方法用于定义相等 (==) 运算符的行为,当你用 a == b 进行比较时,会调用 a __eq__(b), 返回值为布尔值 (True 或 False)。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=telstu1=Student("小明","18","13456789021")
stu2=Student("小红","17","13786789021")
print(stu1==stu2)

输出结果:
False

在 Python 中,使用== 运算符比较对象时,默认情况下比较的是对象的内存地址,而不是其内容。所以== 运算符判断的是两个对象是否是同一个实例。因为 stu1 和 stu2 是两个不同的 Student 实例,它们在内存中占用不同的空间。因此,它们的内存地址不同,比较结果为 False。

实现 __eq__比较方法,我们可以根据对象的属性自定义相等性判断。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=tel# __eq__魔术方法def __eq__(self, other):return self.age <= other.agestu1=Student("小明","18","13456789021")
stu2=Student("小红","17","13786789021")
stu3=Student("小齐","17","13786745521")
print(stu1==stu2)
print(stu2==stu3)

输出结果:
False
True

【例题】
开学了有一批学生信息需要录入系统,请设计一个类,记录学生的姓名、年龄、电话这3类信息。要求通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入。输入完成后,使用print语句,完成信息的输出。

class Student:# 构造方法def __init__(self,name,age,tel):self.name=nameself.age=ageself.tel=tel# 魔法方法,用于定义对象的字符串表示形式def __str__(self):return f"【学生姓名:{self.name},学生年龄:{self.age},学生电话:{self.tel}】"total_students=int(input("请输入需要录入的学生总数:"))
students=[]
# for循环,用于迭代一个由 range 生成的序列。
# range(total_students): range 函数生成一个从 0 到 total_students - 1 的整数序列
# 比如,如果 total_students 是 2,那么 range(2) 会生成 [0, 1]
for i in range(total_students):print(f"当前录入第{i+1}位学生信息,总共需录入{total_students}位学生信息")name=input("请输入学生姓名:")age=input("请输入学生年龄:")tel=input("请输入学生电话:")student=Student(name,age,tel)students.append(student)print(f"学生{i+1}信息录入完成,信息为{student}")print("所有学生信息录入完成,信息如下:")
for student in students:print(student)

输出结果示例:
在这里插入图片描述

相关文章:

Chapter 26 Python魔术方法

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、什么是魔术方法&#xff1f;二、常见的魔术方法① __init__构造方法② __str__字符串方法③ __lt__比较方法④ __le__比较方法⑤ __eq__比较方法 前言 本章将详细讲…...

基于Transformer的语音识别与音频分类

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

leetcode数论(1362. 最接近的因数)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 数论包含最大公约数(>2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。 描述 给…...

sqli-labs-master less1-less6

目录 通关前必看 1、判断是否存在sql注入以及是字符型还是数值型&#xff1a; 2、各种注入方式以及方法 有回显型&#xff1a; 报错注入&#xff08;只有ok和no的提示以及报错提示&#xff09;&#xff1a; 详细思路&#xff0c;后面的题都可以这样去思考 关卡实操 less…...

力扣287【寻找重复数】

给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…...

【2024蓝桥杯/C++/B组/传送阵】

题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …...

(四十一)大数据实战——spark的yarn模式生产环境部署

前言 Spark 是一个开源的分布式计算系统。它提供了高效的数据处理能力&#xff0c;支持复杂的数据分析和处理任务&#xff0c;是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误…...

【深度学习实战(53)】classification_report()

classification_report()是python在机器学习中常用的输出模型评估报告的方法。 classification_report()函数介绍 classification_report()语法如下&#xff1a;classification_report(          y_true,          y_pred,          labelsNone,  …...

计算机网络基础之网络套接字socket编程(初步认识UDP、TCP协议)

绪论​ “宿命论是那些缺乏意志力的弱者的借口。 ——罗曼&#xff0e;罗兰”&#xff0c;本章是为应用层打基础&#xff0c;因为在写应用层时将直接通过文本和代码的形式来更加可视化的理解网络&#xff0c;本章主要写的是如何使用网络套接字和udp、tcp初步认识。 话不多说安…...

手撕Python!模块、包、库,傻傻分不清?一分钟带你弄明白!

哈喽&#xff0c;各位小伙伴们&#xff01;今天咱们来聊聊Python中的模块、包和库&#xff0c;很多新手小白经常搞混&#xff0c;别担心&#xff0c;看完这篇&#xff0c;保证你一分钟就能搞定&#xff01; 打个比方&#xff1a; 模块 (Module): 就好比是一块块乐高积木&#…...

Linux--序列化与反序列化

序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中&#xff0c;对象的状态信息被转换为可以保持或传输的格式&#xff08;如二进制、XML、JSON等&#xff09;。序列化后的数据可以被写入到文件、数据库、内存缓冲区中&#xff0c;或者通…...

使用C#和 aspose.total 实现替换pdf中的文字(外语:捷克语言的pdf),并生成新的pdf导出到指定路径

程序主入口&#xff1a; Program.cs &#xfeff;using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace PdfEditor {public class Progra…...

【Material-UI】Autocomplete中的高亮功能(Highlights)详解

文章目录 一、简介二、实现高亮功能示例代码代码解释 三、实际应用场景1. 搜索功能2. 表单自动完成 四、总结 在现代Web开发中&#xff0c;提供清晰的用户反馈是提升用户体验的重要组成部分。Material-UI的Autocomplete组件通过高亮功能&#xff0c;帮助用户快速识别搜索结果中…...

Android 11(R)启动流程 初版

启动流程 bootloader会去启动android第一个进程Idle&#xff0c;pid为0&#xff0c;会对进程 内存管理等进行初始化。Idle还被称作swapper。Idle会去创建两个进程&#xff0c;一个是init&#xff0c;另外一个是kthread。 kthread会去启动内核&#xff0c;用户是由init进行启动。…...

从零安装pytorch

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种&#xff0c;二者在实现理念上有一定区别&#xff0c;pytorch和人的思维模式与变成习惯更像&#xff0c;而tensorflow则是先构建整体结构&#xff0c;然后整体运行&#xff0c;开发调试过程较为繁…...

2024.07.28 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 特斯拉FSD年底入华&#xff1f;理想成立“端到端”实体组织&#xff1b;小马智行或最快于今年9月赴美IPO 自动驾驶一周资讯 - 特斯拉FSD年底入华&#xff1f;理想…...

python实现小游戏——植物大战僵尸(魔改版本)

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里&#xff0c;我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成&#xff0c;是一个充满创意和趣味的魔改版本。 文章目录 前言一、开发环境准备二、代码1.main方法…...

基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

运行效果&#xff1a; 基于K210的智能人脸与车牌识别系统工程 目录&#xff1a; 运行效果&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、国内外研究现状与发展趋势 二、相关技术基础 2.1 人脸识别技术 2.2 车牌识别技术 三、智能小区门禁系统设计 3.1 系统设计方案 3.2 …...

8.怎么配嵌套子路由,以及它的作用

作用 配嵌套子路由,就是可以通过同一个页面,让不同的位置发生变化,其他的位置不会发生变化,而做到一个局部刷新 例子 红线框住的部分,头部和导航栏是不会发生变化的,变化的只有中间的内容 子路由的操作步骤 将这个页面的头部和导航栏部分的样式和风格,移到主路由上(<tem…...

【海贼王航海日志:前端技术探索】HTML你学会了吗?(二)

目录 1 -> HTML常见标签 1.1 -> 表格标签 1.1.1 -> 基本使用 1.1.2 -> 合并单元格 1.2 -> 列表标签 1.3 -> 表单标签 1.3.1 -> form标签 1.3.2 -> input标签 1.4 -> label标签 1.5 -> select标签 1.6 -> textarea标签 1.7 -> …...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...