news 2026/7/13 1:21:42

day-027-面向对象-下

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day-027-面向对象-下

Day 27:面向对象(下)——特殊方法与类方法

OOP 最后一篇。学会 Python 的"魔法方法"让你的类像内置类型一样好用,了解类方法和静态方法的区别。最后做一个完整的小项目。


一、特殊方法(魔术方法)——让你的类更像 Python

__开头结尾的方法称为特殊方法(也叫魔术方法)。定义它们能让你的类支持len()[]+for...in等内置操作。

__len____getitem__——支持 len() 和 []

classPlaylist:"""歌单类"""def__init__(self,name):self.name=name self.songs=[]defadd_song(self,song):self.songs.append(song)def__len__(self):"""让 len() 可用"""returnlen(self.songs)def__getitem__(self,index):"""让 [] 索引可用"""returnself.songs[index]def__str__(self):returnf"《{self.name}》共{len(self)}首歌"# 使用pl=Playlist("我的最爱")pl.add_song("晴天")pl.add_song("夜曲")pl.add_song("稻香")print(len(pl))# 3 因为实现了 __len__print(pl[0])# 晴天 因为实现了 __getitem__print(pl[1:])# ['夜曲', '稻香'] 切片也行!forsonginpl:# 实现了 __getitem__,就能 for 循环print(song)

__eq____lt__等——支持比较运算

classStudent:def__init__(self,name,score):self.name=name self.score=scoredef__eq__(self,other):"""== 操作"""returnself.score==other.scoredef__lt__(self,other):"""< 操作(实现 __lt__ 后 sorted() 也能用)"""returnself.score<other.scoredef__repr__(self):returnf"Student({self.name},{self.score})"s1=Student("小明",85)s2=Student("小红",92)s3=Student("小刚",78)print(s1==s2)# False (比较成绩)print(s1<s2)# Truestudents=[s1,s2,s3]students.sort()# 按成绩排序(因为实现了 __lt__)print(students)# [Student(小刚, 78), Student(小明, 85), Student(小红, 92)]

__add____mul__等——支持运算符

classVector:"""二维向量"""def__init__(self,x,y):self.x=x self.y=ydef__add__(self,other):"""支持 + 运算"""returnVector(self.x+other.x,self.y+other.y)def__mul__(self,scalar):"""支持 * 标量"""returnVector(self.x*scalar,self.y*scalar)def__repr__(self):returnf"Vector({self.x},{self.y})"v1=Vector(1,2)v2=Vector(3,4)print(v1+v2)# Vector(4, 6)print(v1*3)# Vector(3, 6)

二、类方法 @classmethod——操作类本身

classStudent:school="海淀小学"def__init__(self,name,score):self.name=name self.score=score# 实例方法:第一个参数是 self(实例)definfo(self):returnf"{self.name}({self.school})"# 类方法:第一个参数是 cls(类本身)@classmethoddefchange_school(cls,new_school):cls.school=new_school# 类方法的典型用法:替代构造器@classmethoddeffrom_string(cls,string):"""从字符串创建 Student,如 "小明,85" """name,score=string.split(",")returncls(name.strip(),int(score))# 使用类方法改变类属性Student.change_school("朝阳小学")print(Student.school)# 朝阳小学# 使用类方法创建实例(工厂方法)s=Student.from_string("小红, 92")print(s.info())# 小红 (朝阳小学)

三、静态方法 @staticmethod——不属于实例也不属于类

classMathUtils:@staticmethoddefis_even(n):returnn%2==0@staticmethoddefclamp(value,min_val,max_val):"""把 value 限制在 [min_val, max_val] 之间"""returnmax(min_val,min(value,max_val))# 静态方法不需要 self 或 cls,直接通过类名调用print(MathUtils.is_even(10))# Trueprint(MathUtils.clamp(15,0,10))# 10

三种方法对比

方法类型装饰器第一个参数调用方式
实例方法selfobj.method()
类方法@classmethodclsClass.method()obj.method()
静态方法@staticmethodClass.method()

四、实战——学生管理系统(面向对象版)

classStudent:"""学生类"""def__init__(self,name,age,score):self.name=name self.age=age self.score=score@propertydefgrade(self):ifself.score>=90:return"A"elifself.score>=80:return"B"elifself.score>=60:return"C"return"D"def__str__(self):returnf"{self.name},{self.age}岁,{self.score}分 ({self.grade})"def__repr__(self):returnf"Student('{self.name}',{self.age},{self.score})"classStudentManager:"""管理学生集合"""def__init__(self):self.students=[]defadd(self,name,age,score):s=Student(name,int(age),int(score))self.students.append(s)returnsdefremove(self,name):self.students=[sforsinself.studentsifs.name!=name]deffind(self,name):forsinself.students:ifs.name==name:returnsreturnNonedef__len__(self):returnlen(self.students)def__iter__(self):"""让 for s in manager 可用"""returniter(self.students)deftop_students(self,n=3):"""前 n 名"""returnsorted(self.students,key=lambdas:s.score,reverse=True)[:n]@propertydefaverage(self):ifnotself.students:return0returnsum(s.scoreforsinself.students)/len(self)@classmethoddeffrom_csv(cls,filepath):"""从 CSV 文件创建管理器"""importcsv manager=cls()withopen(filepath,"r",encoding="utf-8")asf:reader=csv.DictReader(f)forrowinreader:manager.add(row["姓名"],row["年龄"],row["成绩"])returnmanager# 使用mgr=StudentManager()mgr.add("小明",18,85)mgr.add("小红",19,92)mgr.add("小刚",18,78)mgr.add("小丽",20,95)print(f"共{len(mgr)}名学生,平均分{mgr.average:.1f}")print("前3名:")forsinmgr.top_students():print(f"{s}")

五、今日学习总结

学习内容掌握情况一句话要点
__len__/__getitem__✅ 重点让对象支持 len() 和 []
__eq__/__lt__✅ 理解比较与排序
__add__/__mul__✅ 了解运算符重载
@classmethod✅ 重点第一个参数是 cls,操作类本身
@staticmethod✅ 理解不需要 self/cls,就是个普通函数

今日踩坑记录

  1. __lt____gt__只需实现一个__lt__(小于)就足够 sorted() 用了。Python 会自动推导__gt__(大于)。
  2. 特殊方法要返回新对象还是修改自身__add__应该返回新对象(不修改自身),__iadd__(+=)才修改自身。
  3. 类方法用错了场景:如果不需要用到类属性或创建实例,普通函数就够了,别硬塞进类里。

六、明天学什么?

OOP 三连结束。明天开始综合练习——把前27天学的全部东西用起来,做一个完整的命令行项目。


特殊方法让你的类融入 Python 生态,类方法让类本身也能做事情。OOP 的工具箱到此齐了。

第27天,打卡完成。明天见!


本系列是个人学习笔记,如有错误欢迎在评论区指正交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 1:21:19

基于TPIS1S1385与PIC24FV32KA304的低功耗智能传感方案

1. 项目概述&#xff1a;基于TPIS1S1385与PIC24FV32KA304的智能传感方案在智能家居和工业自动化领域&#xff0c;存在感应与运动检测技术正经历着从简单红外探测到多传感器融合的演进。传统PIR传感器易受环境温度干扰&#xff0c;而微波雷达又存在功耗过高的问题。TI的TPIS1S13…

作者头像 李华
网站建设 2026/7/13 1:15:39

VMware 桥接 vs NAT 模式对比:2种网络方案下的延迟与安全实测

VMware网络模式深度评测&#xff1a;桥接与NAT的延迟与安全实战分析在虚拟化技术日益普及的今天&#xff0c;VMware作为行业标杆产品&#xff0c;其网络配置的灵活性和性能表现直接影响着开发者和运维人员的工作效率。特别是当我们需要在本地搭建测试环境或部署服务时&#xff…

作者头像 李华
网站建设 2026/7/13 1:14:27

SAS迁Python不是语法翻译,而是数据工作流重构

1. 项目概述&#xff1a;为什么把SAS代码迁移到Python不是“换工具”&#xff0c;而是重构数据工作流在金融风控建模、医药临床统计、大型国企报表系统这些地方&#xff0c;我见过太多人把“SAS迁Python”当成一场简单的语法翻译——打开SAS程序&#xff0c;对照着《SAS函数→P…

作者头像 李华
网站建设 2026/7/13 1:14:17

5分钟搞定魔兽争霸III现代化改造:Warcraft Helper终极兼容指南

5分钟搞定魔兽争霸III现代化改造&#xff1a;Warcraft Helper终极兼容指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在现…

作者头像 李华
网站建设 2026/7/13 1:11:40

外贸SOHO独立站WordPress解决方案

外贸SOHO独立站WordPress主题是针对个人外贸从业者(SOHO&#xff0c;Small Office/Home Office)和小型外贸企业推出的专业建站主题解决方案。该主题基于WordPress平台开发&#xff0c;专为外贸业务需求量身定制&#xff0c;旨在帮助外贸从业者以高效、低成本的方式建立独立的海…

作者头像 李华
网站建设 2026/7/13 1:09:07

宣称“迪奥999同源配方”的贴牌口红靠谱吗?看丝绒与哑光底料公差

宣称“迪奥999同源配方”的贴牌口红靠谱吗&#xff1f;关键不在原料是否同源&#xff0c;而在于丝绒与哑光底料公差能否真正复刻大牌产线级工艺标准。在美妆尾货源头渠道的询盘里&#xff0c;“迪奥999同源配方”几乎成了贴牌口红的标配话术。不少B端买家第一次对接时&#xff…

作者头像 李华