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

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。

text

object ← Master, School ← Prentice ← TuSun
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}制作煎饼果子') 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 封装简介

概述:隐藏对象的属性和实现细节,仅对外提供公共的访问方式。

好处

  1. ✅ 提高代码的安全性(由私有化保证)

  2. ✅ 提高代码的复用性(由函数保证)

弊端:代码量增加了(私有内容需提供公共访问方式)。

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 多态的前提条件

  1. ✅ 要有继承

  2. ✅ 要有方法重写(否则多态无意义)

  3. ✅ 要有父类引用指向子类对象

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 什么是抽象类

  • 抽象类 = 接口,即有抽象方法的类

  • 抽象方法= 没有方法体的方法(方法体是pass

6.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装饰器,第一个参数必须是类对象(cls)

class Student: school = '程序员' @classmethod def show1(cls): print(f'cls: {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 类方法与静态方法的区别

对比项类方法静态方法
装饰器@classmethod@staticmethod
第一个参数类对象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.py)

class 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.py)

from 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', encoding='utf-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', encoding='utf-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', encoding='utf-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.py)

from 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继承B,B继承C,形成继承链
封装私有属性__属性名,通过公共方法访问
多态同一函数,不同对象,不同效果
抽象类有抽象方法的类,用于制定规范
类属性属于类,所有对象共享
对象属性属于对象,各对象独立
类方法@classmethod,第一个参数是cls
静态方法@staticmethod,参数无特殊要求
dict对象转字典,便于序列化

11.2 继承体系图

text

object ├── Master │ └── Prentice (多继承) │ └── TuSun └── School

📝最后提醒:面向对象编程的核心是理解"类与对象"的关系,掌握继承、封装、多态三大特征。学生管理系统是一个综合练习项目,涵盖了面向对象的所有核心知识点,建议大家独立完成代码的编写。

如果觉得有帮助,欢迎点赞、收藏、评论!😊

http://www.jsqmd.com/news/1263970/

相关文章:

  • Visual Studio 2022 C++开发环境搭建与实战配置指南
  • 神经网络与人类认知的相似性及AI应用
  • 小程序毕设选题推荐:基于Django的校园车辆停放智能服务小程序设计【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 为什么选择DynamicJSON?Swift开发者必知的7大核心优势
  • YOLOv11水果识别系统:从数据集构建到PyQt5部署
  • 创世战车WORM流派复兴:雷神炮战术配装与实战解析
  • MSPM0安全启动实战:从CRC校验到CSC核心的嵌入式固件防护
  • 广州发电机回收公司实地测评:本地靠谱商家深度对比 - 广东再生资源回收
  • 2026年芜湖婚姻家事律师推荐实战指南 王肇逵等5位律师经验总结 - 本地品牌推荐
  • AI思维链(CoT)技术:提升模型推理能力的实践指南
  • huststore安全配置详解:RSA加密与身份认证的实现方法
  • 小程序毕业设计-基于 Django 后台的校园智能停车小程序设计与实现 智慧校园车位预约小程序系统设计(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Flutter Reactive BLE:2024年最强大的跨平台蓝牙低功耗开发库全面解析
  • Obsidian Hover Editor与原生预览对比:为什么它能成为你的新宠?
  • LLM-PowerHouse高级技巧:模型分片(Sharding)技术让超大型模型训练成为可能
  • AM62L DEBUGSS调试子系统:从CoreSight架构到多核调试实战
  • Jellium Desktop错误代码参考:常见问题的解决方案
  • 在FreeBSD15.1系统安装Ubuntu24.04 noble Linux兼容系统
  • 2026成都正规猫犬舍测评|明轩猫犬舍CKU认证盆地养宠避坑指南+四季养护攻略+源头基地深度实测 - 同城大型猫犬舍
  • 终极指南:remix-i18next实现URL路径、Cookie与数据库多语言检测
  • Docker一键部署ConPort:官方镜像使用教程与最佳实践
  • 段言中文编程语法翻译模型继续调试
  • PubGrub版本求解算法详解:Rust实现的终极依赖管理解决方案
  • HarmonyOS 实战教程(三):Navigation 导航体系与自定义 TabBar —— 以「柚兔自测量表」为例
  • 中医AR小程序开发:AI穴位识别与智能推荐实践
  • TCP协议细节与Web性能:web-performance教你如何突破传输层瓶颈
  • 从零自制500W轴向磁通电机:电磁设计、绕线工艺与FOC驱动全解析
  • ScaleDown批量处理教程:一次压缩100个提示词的高效方法
  • 如何在5分钟内上手PSone.css?新手必备快速启动教程
  • Buzz监控告警:及时发现并解决平台异常问题