Python基础学习-13
一、面向对象编程入门1、知识点为什么要面向对象面向对象编程OOP的核心思想是把数据和处理数据的方法打包在一起形成一个对象。就像现实世界中一辆车既有属性颜色、速度、油量又有行为加速、刹车、加油——属性和行为属于同一个实体。类Class蓝图/模具定义了一类事物的属性和行为模板。对象Object根据类创建出来的具体实例就像根据模具生产出来的实物。定义类与创建对象class类名:# 类的内容pass类名通常使用大驼峰命名法每个单词首字母大写如StudentCard一个类可以创建无数个对象每个对象拥有独立的属性值__init__构造方法__init__是类的初始化方法也称构造方法在创建对象时自动调用用于给对象的属性赋初始值。classDog:def__init__(self,name,age):self.namename# self.name 是对象的属性name 是传入的参数self.ageageself代表实例本身必须是第一个参数名字约定俗成用self通过self.属性名定义的属性可以在类的其他方法中访问实例方法实例方法是定义在类中的函数第一个参数必须是self通过它访问和操作对象的属性。classDog:def__init__(self,name):self.namenamedefbark(self):print(f{self.name}汪汪叫)调用方式对象.方法名()类属性 vs 实例属性类型定义位置归属共享性实例属性__init__中通过self.xxx定义每个对象独立持有互不影响类属性直接写在类体内方法外属于类本身所有实例共享classStudent:school清华附中# 类属性所有学生共享def__init__(self,name):self.namename# 实例属性每个学生有不同的名字2、代码示例银行账户classBankAccount:银行账户类def__init__(self,owner,balance0):初始化账户开户人、余额self.ownerowner self.balancebalancedefdeposit(self,amount):存款ifamount0:self.balanceamountprint(f存入{amount}元当前余额{self.balance})else:print(存款金额必须大于0)defwithdraw(self,amount):取款if0amountself.balance:self.balance-amountprint(f取出{amount}元当前余额{self.balance}元)else:print(余额不足或金额无效)defshow_balance(self):显示余额print(f{self.owner}的账户余额{self.balance}元)#创建对象并使用acc1BankAccount(小明,1000)acc1.show_balance()# 小明 的账户余额: 1000 元acc1.deposit(500)# 存入 500 元当前余额: 1500 元acc1.withdraw(300)# 取出 300 元当前余额: 1200 元acc2BankAccount(小红,2000)acc2.show_balance()# 小红 的账户余额: 2000 元与小明的账户互不影响学生管理系统classStudent:学生类管理学生信息与成绩#类属性所有学生使用同一套等级标准grade_standard{90:优秀,80:良好,60:及格,0:不及格}def__init__(self,name,student_id):初始化姓名学号空成绩列表self.namename self.student_idstudent_id self.score[]# 存储各科成绩的列表self.__password123456# 私有属性约定双下划线开头defadd_score(self,subject,score):添加一门课的成绩if0score100:self.score.append({科目:subject,分数:score})print(f{self.name}{subject}成绩{score}已录入)else:print(成绩应在0-100之间)defget_average(self):计算平均分数ifnotself.score:return0totalsum(item[分数]foriteminself.score)returntotal/len(self.score)defget_grade(self):根据平均分返回等级avgself.get_average()forthresholdinsorted(self.grade_standard.keys(),reverseTrue):ifavgthreshold:returnself.grade_standard[threshold]return未知defshow_report(self):打印成绩单print(f\n{self.name}({self.student_id}) 成绩单 )foriteminself.score:print(f{item[科目]}:{item[分数]})print(f 平均分:{self.get_average():.1f})print(f 等级:{self.get_grade()})print(*35)#测试stu1Student(张三,20260701)stu1.add_score(语文,85)stu1.add_score(数学,92)stu1.add_score(英语,78)stu1.show_report()stu2Student(李四,2024002)stu2.add_score(语文,95)stu2.add_score(数学,88)stu2.show_report()3、补充self不是关键字理论上可以换成任何名字如this但 Python 社区强烈约定使用self换名字会让你的代码被同行鄙视。私有属性的约定Python 没有真正的私有机制。_name单下划线表示受保护的__name双下划线会触发名称改写Name Mangling变成_ClassName__name是一种弱保护。面向对象设计原则速览单一职责一个类只负责一件事别让Student类又管成绩又管排课表组合优于继承能用有一个组合解决的别急着用是一个继承依赖倒置依赖抽象而非具体实现二、继承与多态1、知识点继承是什么继承**是一种is-a关系——子类是父类的一种特化版本。子类自动拥有父类的所有属性和方法同时可以添加新功能或修改已有行为。父类基类 ──继承── 子类派生类 Animal Dog ├── name ├── name继承 └── speak() ├── speak()重写 └── wag_tail()新增单继承一个子类只有一个直接父类结构清晰90% 的场景够用多继承一个子类同时继承多个父类Mixin 模式的核心基础核心概念对比表概念作用关键语法典型场景单继承子类复用父类代码class Dog(Animal)大多数继承需求方法重写子类提供自己的实现子类中定义同名方法定制父类行为super()调用父类的方法super().method()初始化继承链、扩展父类方法多继承组合多个父类能力class C(A, B)Mixin 模式、多重能力组合MRO方法解析顺序ClassName.__mro__理解多继承调用路径鸭子类型关注行为而非类型无需继承有方法即可松耦合设计、插件系统方法重写 vs super() 扩展方式代码效果完全重写def speak(self): print(汪汪)父类方法被覆盖不再调用扩展重写def speak(self): super().speak(); print(汪汪)先执行父类逻辑再追加子类逻辑鸭子类型 vs 传统继承维度继承多态鸭子类型关系要求必须有继承关系无需继承有方法即可类型检查isinstance(obj, Parent)不检查类型耦合度较高极低Python 哲学能用但不推荐滥用“如果它走路像鸭子叫起来像鸭子它就是鸭子”2、代码示例单继承方法重写# 单继承 方法重写# 演示子类继承父类属性并重写方法classAnimal:动物类def__init__(self,name):self.namename# 为示例设置名字属性defspeak(self):动物叫声通用returnf{self.name}发出声音definfo(self):展示信息returnf我是{self.name}classDog(Animal):狗类继承自动物defspeak(self):重写父类speak方法——提供狗的特化行为returnf{self.name}汪汪叫defwag_tail(self):狗独有的方法——父类没有returnf{self.name}摇尾巴~classCat(Animal):猫类继承自动物defspeak(self):# 每个子类根据自己的特点重写 speakreturnf{self.name}喵喵叫# 使用示例dogDog(旺财)# 创建 Dog 实例传入名字catCat(咪咪)# 创建 Cat 实例print(dog.info())# 调用继承自 Animal 的 info()——输出我是 旺财print(dog.speak())# 调用 Dog 重写的 speak()——输出旺财 汪汪叫print(dog.wag_tail())# 调用 Dog 独有的方法——输出旺财 摇尾巴~print(cat.info())# 调用继承自 Animal 的 info()——输出我是 咪咪print(cat.speak())# 调用 Cat 重写的 speak()——输出咪咪 喵喵叫super() 的使用场景#super()classPerson:人类基类def__init__(self,name,age):self.namename self.ageageprint(fPerson.__init__ 被调用{name},{age}岁)defintroduce(self):returnf我叫{self.name}今年{self.age}岁#场景1super().__init__() 初始化继承链classStudent(Person):def__init__(self,name,age,student_id):# super()调用父类 Person的__init__,传递name和agesuper().__init__(name,age)self.student_idstudent_id#子类独有属性defintroduce(self):# 场景二“扩展父类方法——先拿父类再追加自己的base_infosuper().introduce()returnf{base_info}学号{self.student_id}#场景三多继承中super()classTalker:说话能力 Mixindefspeak_message(self):return我能说话classRunner:跑步能力 Mixindefrun_message(self):return我能跑步classSuperStudent(Student,Talker,Runner):多继承的学生——同时拥有学生属性 说话 跑步能力def__init__(self,name,age,student_id):# super() 按 MRO 顺序调用下一个类的 __init__super().__init__(name,age,student_id)# --- 使用示例 ---stuStudent(小明,20,S2024001)print(stu.introduce())# 输出我叫 小明今年 20 岁学号 S2024001super_stuSuperStudent(小红,21,S2024002)print(super_stu.introduce())# 来自 Student - Personprint(super_stu.speak_message())# 来自 Talkerprint(super_stu.run_message())# 来自 Runner多继承 MRO# 2.3 多继承 和 MRO方法解析顺序classA:defmethod(self):print(A.method 被调用)# 关键即使 A 没有显式继承其他类# 在多继承场景下 super() 仍会按 MRO 链继续调用classB(A):defmethod(self):print(B.method 被调用)super().method()# 按 MRO 顺序找下一个classC(A):defmethod(self):print(C.method 被调用)super().method()# 按 MRO 顺序找下一个classD(B,C):多继承D 继承 B 和 Cdefmethod(self):print(D.method 被调用)super().method()# 按 MRO 顺序找下一个# --- 查看 MRO ---print(D 的 MRO 顺序:)forclsinD.__mro__:# __mro__ 返回方法解析顺序的元组print(f -{cls.__name__})print(\n调用 d.method():)dD()# 创建 D 实例d.method()# 观察调用链D - B - C - AC3 线性化规则Python 保证子类在父类前面且保持父类原有的声明顺序。这就是为什么D(B, C)中 B 在 C 之前。鸭子类型# 鸭子类型只要对象有需要的方法就能正常工作classDuck:鸭子类defquack(self):return嘎嘎嘎deffly(self):return鸭子飞起来了classPerson:人类并没有继承DCUKdefquack(self):return学鸭子叫deffly(self):return坐飞机飞classDog:狗只有quack没有flydefquack(self):return汪汪## 关键函数不检查类型只检查对象是否有需要的方法defmake_it_quack(thing):让任何能 quack 的对象发出叫声——鸭子类型的核心思想print(thing.quack())defmake_it_fly(thing):让任何能 fly 的对象飞——关注行为而非类型print(thing.fly())#示例duckDuck()personPerson()dogDog()print(叫)make_it_quack(duck)# 输出嘎嘎嘎make_it_quack(person)# 输出我学鸭子叫嘎嘎嘎make_it_quack(dog)# 输出汪汪假装是鸭子print(飞)make_it_fly(duck)make_it_fly(person)# make_it_fly(dog) # 会报错Dog 没有 fly 方法——但这不是类型问题

相关新闻

C++并发编程:std::lock_guard与std::unique_lock深度解析与应用实战

C++并发编程:std::lock_guard与std::unique_lock深度解析与应用实战

1. 项目概述:为什么C并发编程绕不开锁管理?干了这么多年C后台开发,我敢说,但凡涉及到多线程、高并发,锁就是你永远绕不过去的一道坎。新手一上来,可能觉得std::mutex一锁了事,简单粗暴。但真到了…

2026/10/11 20:20:06 阅读更多 →
Shader编程入门指南:从零到一掌握GPU着色器开发

Shader编程入门指南:从零到一掌握GPU着色器开发

1. 项目概述:为什么Shader编程值得你投入时间?如果你对游戏里流动的水面、武器上闪烁的寒光、角色身上随风飘动的布料感到好奇,想知道这些令人惊叹的视觉效果是如何从代码中“生长”出来的,那么Shader编程就是你必须要打开的那扇门…

2026/10/13 1:53:50 阅读更多 →
Nginx 连接处理方法 - 核心编程

Nginx 连接处理方法 - 核心编程

Nginx支持各种连接处理方法。特定处理方法的可用性取决于所使用的平台(你使用的操作系统)。在支持多种处理方法的平台上,Nginx 通常会自动选择最有效的处理方法。但是,如果需要,可以使用 USE 指令显式地选择连接处理方…

2026/10/12 6:04:40 阅读更多 →

最新新闻

实习考勤不内耗:习讯云打卡全流程避坑指南

实习考勤不内耗:习讯云打卡全流程避坑指南

实习第一个月,我差点被习讯云实习考勤打卡逼到内耗。每天到公司第一件事不是换工牌,而是掏出手机打开习讯云,看定位转圈、看按钮变灰、看页面弹“不在考勤范围”,一套流程下来,本来就不多的精气神先耗掉三分之一。后来…

2026/10/13 4:58:19 阅读更多 →
长连接与短连接:高并发系统中的TCP连接治理实战

长连接与短连接:高并发系统中的TCP连接治理实战

1. 从一次“连接超时”告警说起:为什么我们总在长连接和短连接之间反复横跳?上周五下午三点,某公司后台监控系统突然弹出一连串红色告警:“订单服务TCP连接数突增300%”“网关节点CPU持续92%”“下游支付接口响应延迟突破800ms”。…

2026/10/13 4:58:19 阅读更多 →
微电网风光柴储经济调度:Matlab建模与求解实战

微电网风光柴储经济调度:Matlab建模与求解实战

微电网经济调度,很多刚入门的同学一看“风光柴储”四个字就有点发怵,觉得光是理解拓扑就够复杂了,还要在Matlab里做优化,更是一头雾水。但实际做下来你会发现,它本质就是一个带约束的数学优化问题:把风机、…

2026/10/13 4:58:19 阅读更多 →
Llama 3 架构精读与 FP8 量化实战:长上下文部署全记录

Llama 3 架构精读与 FP8 量化实战:长上下文部署全记录

Llama 3 出来之后,圈子里聊得最多的其实就两件事:一是架构上到底改了些什么,二是它到底能不能被普通人跑起来。官方博客里的参数表人人都能搜到,但真正上手就会发现,一张表和你实际推理时的显存、吞吐、质量完全是两码…

2026/10/13 4:58:19 阅读更多 →
B端体验设计缓解视觉疲劳:色彩降噪、信息密度与深色模式实战

B端体验设计缓解视觉疲劳:色彩降噪、信息密度与深色模式实战

最近在复盘一个后台管理系统项目时,客户方的运营主管跟我说了一句特别真实的话:“连续录入三小时单据,眼睛胀得不行,下班后看什么都带重影。”这句话我一直记到现在。B端体验设计与C端最大的分野就在这里:C端用户是“看…

2026/10/13 4:58:19 阅读更多 →
UCINET数据导入实战:格式规范、Excel整理与高频排错

UCINET数据导入实战:格式规范、Excel整理与高频排错

1. 先搞清楚UCINET到底在等什么数据很多人在UCINET上栽的第一个跟头,不是不会跑算法,而是数据根本喂不进去。明明Excel里填得工工整整,一点Import却报错,或者导进去之后变成一团乱麻,节点对不上、值全错位。这些问题的…

2026/10/13 4:57:19 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →