Python 面向对象进阶与实战:从继承到学生管理系统

📅 2026/7/25 23:34:12
Python 面向对象进阶与实战:从继承到学生管理系统
大家好今天我们来深入学习 Python 面向对象编程的进阶知识包括子类重写父类功能、多层继承、封装、多态、抽象类等核心概念最后通过一个完整的学生管理系统项目将所学知识融会贯通。 目录一、子类重写父类功能二、子类访问父类功能三、多层继承四、封装与私有属性五、多态六、抽象类七、类属性与对象属性八、类方法与静态方法九、dict属性十、项目实战学生管理系统十一、总结一、子类重写父类功能1.1 什么是重写重写覆盖子类出现和父类同名的属性或行为称之为重写。调用层次遵循就近原则——子类有就用没有就去就近的父类找依次查找其所有父类。1.2 重写演示# 师傅类 class Master: def __init__(self): self.kongfu [古法煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) # 学校类 class School: def __init__(self): self.kongfu [AI煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) # 徒弟类 - 重写父类功能 class Prentice(School, Master): def __init__(self): self.kongfu [独创煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) # 测试 p Prentice() print(p.kongfu) # 输出: [独创煎饼果子配方] p.make_cake() # 输出: 运用[独创煎饼果子配方]制作煎饼果子二、子类访问父类功能子类重写父类功能后如果想继续访问父类的功能有两种方式。2.1 方式一父类名.父类功能名(self)特点精准访问想找哪个父类就调用哪个父类。class Prentice(School, Master): def __init__(self): self.kongfu [独创煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) # 精准访问父类功能 def make_master_cake(self): Master.__init__(self) # 初始化父类属性 Master.make_cake(self) # 调用父类方法 def make_school_cake(self): School.__init__(self) School.make_cake(self) p Prentice() p.make_master_cake() # 输出: 运用[古法煎饼果子配方]制作煎饼果子 p.make_school_cake() # 输出: 运用[AI煎饼果子配方]制作煎饼果子2.2 方式二super().父类功能名()特点只能访问最近的那个父类有就用没有就往后继续查找。class Prentice(School, Master): def __init__(self): self.kongfu [独创煎饼果子配方] def make_old_cake(self): super().__init__() super().make_cake() # 调用最近的父类School的方法 p Prentice() p.make_old_cake() # 调用 School 的 make_cake三、多层继承多层继承类A继承类B类B继承类C。textobject ← Master, School ← Prentice ← TuSunclass Master: def __init__(self): self.kongfu [古法煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) class School: def __init__(self): self.kongfu [AI煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) class Prentice(School, Master): def __init__(self): self.kongfu [独创煎饼果子配方] def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) def make_master_cake(self): Master.__init__(self) Master.make_cake(self) def make_school_cake(self): School.__init__(self) School.make_cake(self) # 徒孙类继承 Prentice class TuSun(Prentice): pass ts TuSun() ts.make_cake() # 独创配方 ts.make_master_cake() # 古法配方 ts.make_school_cake() # AI配方四、封装与私有属性4.1 封装简介概述隐藏对象的属性和实现细节仅对外提供公共的访问方式。好处✅ 提高代码的安全性由私有化保证✅ 提高代码的复用性由函数保证弊端代码量增加了私有内容需提供公共访问方式。4.2 私有属性格式# 私有属性 __属性名 # 私有方法 __函数名()4.3 私有属性演示class Prentice: def __init__(self): self.kongfu [煎饼果子配方] self.__money 20000 # 私有属性私房钱 def make_cake(self): print(f运用{self.kongfu}制作煎饼果子) # 提供公共的访问方式 def get_money(self): return self.__money def set_money(self, money): self.__money money class TuSun(Prentice): pass ts TuSun() print(ts.kongfu) # ✅ 可以访问 # print(ts.__money) # ❌ 报错私有属性子类无法直接访问 ts.set_money(100) # ✅ 通过公共方法访问 print(ts.get_money()) # 输出: 100五、多态5.1 什么是多态专业版同一个函数接收不同的参数有不同的效果大白话同一个事物在不同时刻表现出不同的状态、形态5.2 多态的前提条件✅ 要有继承✅ 要有方法重写否则多态无意义✅ 要有父类引用指向子类对象5.3 多态案例动物叫声# 1. 定义抽象父类 class Animal: def speak(self): pass # 抽象方法 # 2. 子类重写父类方法 class Dog(Animal): def speak(self): print(狗叫: 汪汪汪) class Cat(Animal): def speak(self): print(猫叫: 喵喵喵) class Car: def speak(self): print(车叫: 滴滴滴) # 3. 定义函数接收不同对象 def make_noise(an): an.speak() # 4. 测试多态 d Dog() c Cat() car Car() make_noise(d) # 狗叫: 汪汪汪 make_noise(c) # 猫叫: 喵喵喵 make_noise(car) # 车叫: 滴滴滴不需要继承也能使用5.4 多态案例战斗平台# 英雄机1代 class HeroFighter: def power(self): return 60 # 英雄机2代继承1代 class AdvHeroFighter(HeroFighter): def power(self): return 80 # 敌机1代 class EnemyFighter: def power(self): return 70 # 战斗平台多态体现 def object_play(hero, enemy): if hero.power() enemy.power(): print(英雄机 战胜 敌机!) else: print(英雄机 惜败 敌机!) h1 HeroFighter() h2 AdvHeroFighter() e1 EnemyFighter() object_play(h1, e1) # 英雄机 惜败 敌机! object_play(h2, e1) # 英雄机 战胜 敌机!六、抽象类6.1 什么是抽象类抽象类 接口即有抽象方法的类抽象方法 没有方法体的方法方法体是pass6.2 抽象类的作用抽象类一般充当父类用于指定行业规范、准则具体的实现交由子类来完成。6.3 抽象类案例空调# 1. 定义抽象类空调规范 class AC: def cool_wind(self): # 抽象方法 pass def hot_wind(self): # 抽象方法 pass def swing_l_r(self): # 抽象方法 pass # 2. 子类实现抽象方法 class XiaoMi(AC): def cool_wind(self): print(小米 核心 制冷技术!) def hot_wind(self): print(小米 核心 制热技术!) def swing_l_r(self): print(小米空调 静音左右摆风 技术!) class Gree(AC): def cool_wind(self): print(格力 核心 制冷技术!) def hot_wind(self): print(格力 核心 制热技术!) def swing_l_r(self): print(格力空调 低频左右摆风 技术!) xm XiaoMi() xm.cool_wind() # 小米 核心 制冷技术! gree Gree() gree.cool_wind() # 格力 核心 制冷技术!七、类属性与对象属性7.1 图解text类属性 ──┬── 对象1 ── 对象属性 ├── 对象2 ── 对象属性 ├── 对象3 ── 对象属性 └── 对象4 ── 对象属性7.2 区别对比类型定义位置归属修改影响调用方式对象属性__init__方法中每个对象独有只影响当前对象对象名.属性名类属性类中、函数外类本身所有对象共享影响所有对象类名.属性名或对象名.属性名7.3 代码演示class Student: # 类属性所有对象共享 teacher_name 水镜先生 # 对象属性每个对象独有 def __init__(self, name, age): self.name name self.age age def __str__(self): return f姓名: {self.name}, 年龄: {self.age} s1 Student(曹操, 38) s2 Student(刘备, 35) # 修改对象属性 s1.name 许褚 print(s1) # 姓名: 许褚, 年龄: 40 print(s2) # 姓名: 刘备, 年龄: 35 # 修改类属性影响所有对象 Student.teacher_name 夯哥 print(s1.teacher_name) # 夯哥 print(s2.teacher_name) # 夯哥八、类方法与静态方法8.1 类方法属于类的方法可通过类名.或对象名.调用使用classmethod装饰器第一个参数必须是类对象clsclass Student: school 程序员 classmethod def show1(cls): print(fcls: {cls}) print(cls.school) print(我是类方法) # 调用 Student.show1() # 通过类名调用 s Student() s.show1() # 通过对象名调用8.2 静态方法属于该类下所有对象共享的方法使用staticmethod装饰器参数无特殊要求class Student: school 程序员 staticmethod def show2(): print(Student.school) print(我是静态方法) # 调用 Student.show2() # 通过类名调用 s Student() s.show2() # 通过对象名调用8.3 类方法与静态方法的区别对比项类方法静态方法装饰器classmethodstaticmethod第一个参数类对象cls无要求使用场景需要访问类属性/类方法时不需要访问类相关时九、dict属性__dict__是 Python 内置属性可以把对象转成字典形式。from student import Student # 1. 对象 → 字典 s1 Student(德桦, 男, 81, 111, 刻骨铭心) my_dict s1.__dict__ print(my_dict) # 输出: {name: 德桦, gender: 男, age: 81, phone: 111, desc: 刻骨铭心} # 2. 列表套对象 → 列表套字典 stu_list [s1, s2, s3] list_dict [stu.__dict__ for stu in stu_list] # 3. 字典 → 对象使用 ** 解包 my_dict {name: 德桦, gender: 男, age: 81, phone: 111, desc: 刻骨铭心} s5 Student(**my_dict) # 等价于 Student(name德桦, ...) print(s5)十、项目实战学生管理系统10.1 项目结构text学生管理系统/ ├── student.py # 学生类 ├── studentcms.py # 学生管理系统类核心业务 └── main.py # 程序入口文件10.2 学生类student.pyclass Student: def __init__(self, name, gender, age, phone, desc): self.name name self.gender gender self.age age self.phone phone self.desc desc def __str__(self): return f姓名: {self.name}, 性别: {self.gender}, 年龄: {self.age}, 手机号: {self.phone}, 描述: {self.desc}10.3 管理系统类studentcms.pyfrom student import Student import time class StudentCMS: def __init__(self): self.stu_list [] # 存储学生对象 staticmethod def show_view(): print(* * 23) print(学生管理系统V2.0版) print(\t1.添加学生信息) print(\t2.删除学生信息) print(\t3.修改学生信息) print(\t4.查询单个学生信息) print(\t5.查询所有学生信息) print(\t6.保存学生信息) print(\t0.退出系统) print(* * 23) def add_student(self): 添加学生 name input(请输入学生姓名:) gender input(请输入学生性别:) age int(input(请输入学生年龄:)) phone input(请输入学生电话:) desc input(请输入学生描述信息:) stu Student(name, gender, age, phone, desc) self.stu_list.append(stu) print(f添加 {name} 学生信息成功!\n) def del_student(self): 删除学生 del_name input(请输入要删除的学生姓名:) for stu in self.stu_list: if stu.name del_name: self.stu_list.remove(stu) print(f学员 {del_name} 信息删除成功!\n) break else: print(查无此人, 请检查后重新删除!\n) def update_student(self): 修改学生 upd_name input(请输入要修改的学生姓名:) for stu in self.stu_list: if stu.name upd_name: stu.gender input(请录入修改后的性别: ) stu.age int(input(请录入修改后的年龄: )) stu.phone input(请录入修改后的电话: ) stu.desc input(请录入修改后的描述信息: ) print(f学员 {upd_name} 信息修改成功!\n) break else: print(查无此人, 请检查后重新操作!\n) def search_one_student(self): 查询单个学生 search_name input(请输入要查找的学生姓名:) for stu in self.stu_list: if stu.name search_name: print(stu, end\n\n) break else: print(查无此人, 请检查后重新操作!\n) def search_all_student(self): 查询所有学生 if not self.stu_list: print(暂无学生信息, 请添加后查询! \n) else: for stu in self.stu_list: print(stu) print() def save_student(self): 保存学生信息到文件 with open(./stu_data.txt, w, encodingutf-8) as f: stu_dict [stu.__dict__ for stu in self.stu_list] f.write(str(stu_dict)) def load_student(self): 从文件加载学生信息 try: with open(./stu_data.txt, r, encodingutf-8) as f: stu_data f.read() stu_list eval(stu_data) self.stu_list [Student(**stu_dict) for stu_dict in stu_list] except FileNotFoundError: with open(./stu_data.txt, w, encodingutf-8) as f: pass def start(self): 启动系统 self.load_student() while True: time.sleep(1) self.show_view() input_num input(请输入您要操作的编号:) if input_num 1: self.add_student() elif input_num 2: self.del_student() elif input_num 3: self.update_student() elif input_num 4: self.search_one_student() elif input_num 5: self.search_all_student() elif input_num 6: self.save_student() print(保存学生信息成功!\n) elif input_num 0: result input(您确定要退出吗? (Y/N) - ) if result.lower() y: self.save_student() print(谢谢您的使用, 期待下次再会!) break else: print(录入有误, 请重新录入!\n)10.4 入口文件main.pyfrom studentcms import StudentCMS if __name__ __main__: stu_cms StudentCMS() stu_cms.start()10.5 功能演示text*********************** 学生管理系统V2.0版 1.添加学生信息 2.删除学生信息 3.修改学生信息 4.查询单个学生信息 5.查询所有学生信息 6.保存学生信息 0.退出系统 *********************** 请输入您要操作的编号:十一、总结11.1 核心知识点回顾知识点要点重写子类定义与父类同名的方法/属性就近原则访问父类父类名.方法(self)或super().方法()多层继承类A继承BB继承C形成继承链封装私有属性__属性名通过公共方法访问多态同一函数不同对象不同效果抽象类有抽象方法的类用于制定规范类属性属于类所有对象共享对象属性属于对象各对象独立类方法classmethod第一个参数是cls静态方法staticmethod参数无特殊要求dict对象转字典便于序列化11.2 继承体系图textobject ├── Master │ └── Prentice (多继承) │ └── TuSun └── School最后提醒面向对象编程的核心是理解类与对象的关系掌握继承、封装、多态三大特征。学生管理系统是一个综合练习项目涵盖了面向对象的所有核心知识点建议大家独立完成代码的编写。如果觉得有帮助欢迎点赞、收藏、评论