作者: 中文编程倡导者------ 李金雨
联系方式: wbtm2718@qq.com
系列: python中文编程入门教程** 核心理念: AI时代必须使用中文编程,母语编程阅读效率极高"
第8篇:模板与实例------面向对象编程入门(上)
开篇引入
本课目标
- 理解什么是模板(类)和实例(对象)
- 掌握为什么要使用模板
- 掌握如何定义模板(class)
- 掌握如何创建实例(对象)
- 理解成员数据(属性)的概念和使用
- 理解成员功能(方法)的概念和使用
- 理解self参数的含义
生活场景引入
同学们,在日常生活中,我们经常会遇到一些具有共同特征的事物:
- 饼干店里的饼干都是用同一个模具做出来的
- 小区里的房子都是按照同一套图纸建造的
- 孩子们用乐高积木拼出来的模型都是按照说明书搭建的
在Python中,我们可以使用类(模板)来描述这些具有共同特征的事物,然后创建对象(实例)来表示具体的个体。面向对象编程让我们可以更自然地模拟现实世界中的事物。
预期成果展示
在本课结束时,你将能够:
- 定义自己的类(模板)
- 创建类的实例(对象)
- 给类添加成员数据和成员方法
- 访问和修改对象的属性
- 调用对象的方法
- 编写一个学生类和一个动物类
概念讲解
1. 什么是模板(类)和实例(对象)
模板(类):是一种抽象的描述,定义了一组属性和方法,用于创建具有共同特征的对象。
实例(对象):是根据类创建的具体个体,具有类定义的属性和方法。
生活例子:
- 模板就像饼干模具,实例就像具体的饼干
- 模板就像建筑图纸,实例就像建好的房子
- 模板就像乐高说明书,实例就像拼好的模型
代码示例:
python
# 定义一个学生模板(类)
class 学生:
"""学生模板,用于创建学生实例"""
pass
# 创建学生实例(对象)
学生一 = 学生()
学生二 = 学生()
print(学生一)
print(学生二)
2. 为什么要用模板
使用模板(类)有以下好处:
- 代码复用:可以创建多个具有相同结构的对象
- 数据封装:将数据和操作数据的方法封装在一起
- 逻辑清晰:使代码更加结构化和易于理解
- 便于维护:修改类的定义会影响所有实例
生活例子:
- 饼干模具可以做出很多相同形状的饼干
- 建筑图纸可以用来建造多栋相同的房子
- 乐高说明书可以用来拼出多个相同的模型
3. 定义模板(class)
在Python中,我们使用class关键字来定义类。
基本结构:
python
class 类名:
"""类的说明文档"""
# 类的属性和方法
模板命名规范:
- 类名应该使用中文名词
- 类名的首字母应该大写(大驼峰命名法)
代码示例:
python
# 定义学生模板
class 学生:
"""学生模板,用于创建学生实例"""
pass
# 定义动物模板
class 动物:
"""动物模板,用于创建动物实例"""
pass
# 定义汽车模板
class 汽车:
"""汽车模板,用于创建汽车实例"""
pass
4. 创建实例(对象)
创建实例(对象)的过程称为实例化,语法为实例名 = 类名()。
实例命名规范:
- 实例名应该使用中文名词
- 实例名应该小写
代码示例:
python
# 创建学生实例
学生一 = 学生()
学生二 = 学生()
# 创建动物实例
狗 = 动物()
猫 = 动物()
# 创建汽车实例
轿车 = 汽车()
卡车 = 汽车()
print(学生一)
print(狗)
print(轿车)
5. 成员数据(属性)
成员数据是类中定义的变量,用于存储对象的状态。
定义成员数据:
python
class 学生:
"""学生模板"""
def __init__(self, 姓名, 年龄):
"""初始构造功能"""
self.姓名 = 姓名
self.年龄 = 年龄
self.成绩 = 0
访问和修改成员数据:
python
# 访问成员数据
print(学生一.姓名)
print(学生一.年龄)
# 修改成员数据
学生一.成绩 = 95
print(学生一.成绩)
生活例子:
- 学生的姓名、年龄、成绩
- 动物的名称、年龄、种类
- 汽车的品牌、颜色、速度
代码示例:
python
# 定义学生模板
class 学生:
"""学生模板"""
def __init__(self, 姓名, 年龄):
"""初始构造功能"""
self.姓名 = 姓名
self.年龄 = 年龄
self.成绩 = 0
# 创建学生实例
学生一 = 学生("张三", 15)
学生二 = 学生("李四", 16)
# 访问成员数据
print(学生一.姓名, 学生一.年龄, 学生一.成绩)
print(学生二.姓名, 学生二.年龄, 学生二.成绩)
# 修改成员数据
学生一.成绩 = 95
学生二.成绩 = 88
print(学生一.姓名, "的成绩是:", 学生一.成绩)
print(学生二.姓名, "的成绩是:", 学生二.成绩)
6. 成员功能(方法)
成员功能是类中定义的函数,用于操作对象的状态。
定义成员功能:
python
class 学生:
"""学生模板"""
def __init__(self, 姓名, 年龄):
"""初始构造功能"""
self.姓名 = 姓名
self.年龄 = 年龄
self.成绩 = 0
def 学习(self, 科目):
"""学生学习某个科目"""
print(f"{self.姓名}正在学习{科目}")
def 考试(self, 科目, 分数):
"""学生参加某科目的考试"""
self.成绩 = 分数
print(f"{self.姓名}的{科目}考了{分数}分")
调用成员功能:
python
# 调用成员功能
学生一.学习("数学")
学生一.考试("数学", 95)
self参数的含义:
- self是一个特殊参数,指向当前对象
- 在方法内部,通过self访问对象的属性和方法
- 调用方法时,不需要传递self参数
生活例子:
- 学生的学习、考试方法
- 动物的吃、睡方法
- 汽车的启动、加速方法
代码示例:
python
# 定义学生模板
class 学生:
"""学生模板"""
def __init__(self, 姓名, 年龄):
"""初始构造功能"""
self.姓名 = 姓名
self.年龄 = 年龄
self.成绩 = 0
self.科目列表 = []
# 成员功能
def 学习(self, 科目):
"""学生学习某个科目"""
self.科目列表.append(科目)
print(f"{self.姓名}正在学习{科目}")
def 考试(self, 科目, 分数):
"""学生参加某科目的考试"""
self.成绩 = 分数
print(f"{self.姓名}的{科目}考了{分数}分")
def 显示信息(self):
"""显示学生的所有信息"""
print(f"姓名:{self.姓名}")
print(f"年龄:{self.年龄}岁")
print(f"成绩:{self.成绩}分")
print(f"学习的科目:{self.科目列表}")
# 创建实例
学生一 = 学生("张三", 15)
学生一.学习("数学")
学生一.学习("英语")
学生一.考试("数学", 95)
学生一.显示信息()
动手实践
基础练习(必做)
-
创建动物模板 :编写一个动物类,包含名称、年龄、声音,以及"叫"的功能
python# 动物模板 class 动物: """动物模板""" def __init__(self, 名称, 年龄, 声音): """初始构造功能""" self.名称 = 名称 self.年龄 = 年龄 self.声音 = 声音 def 叫(self): """动物发出叫声""" print(f"{self.名称}发出{self.声音}的叫声") def 显示信息(self): """显示动物信息""" print(f"名称:{self.名称}") print(f"年龄:{self.年龄}岁") print(f"叫声:{self.声音}") # 创建实例 狗 = 动物("小狗", 2, "汪汪") 猫 = 动物("小猫", 1, "喵喵") 狗.叫() 猫.叫() 狗.显示信息() 猫.显示信息() -
创建汽车模板 :编写一个汽车类,包含品牌、颜色、速度,以及"加速"、"减速"功能
python# 汽车模板 class 汽车: """汽车模板""" def __init__(self, 品牌, 颜色, 速度=0): """初始构造功能""" self.品牌 = 品牌 self.颜色 = 颜色 self.速度 = 速度 def 加速(self, 增加速度): """汽车加速""" self.速度 += 增加速度 print(f"{self.颜色}的{self.品牌}加速到{self.速度} km/h") def 减速(self, 减少速度): """汽车减速""" self.速度 = max(0, self.速度 - 减少速度) print(f"{self.颜色}的{self.品牌}减速到{self.速度} km/h") def 显示信息(self): """显示汽车信息""" print(f"品牌:{self.品牌}") print(f"颜色:{self.颜色}") print(f"当前速度:{self.速度} km/h") # 创建实例 轿车 = 汽车("宝马", "红色") 卡车 = 汽车("解放", "蓝色") 轿车.加速(60) 轿车.加速(30) 轿车.减速(20) 轿车.显示信息() 卡车.加速(40) 卡车.减速(10) 卡车.显示信息()
进阶练习(选做)
-
创建书籍模板 :编写一个书籍类,包含书名、作者、价格,以及"显示信息"功能
python# 书籍模板 class 书籍: """书籍模板""" def __init__(self, 书名, 作者, 价格): """初始构造功能""" self.书名 = 书名 self.作者 = 作者 self.价格 = 价格 def 显示信息(self): """显示书籍信息""" print(f"书名:{self.书名}") print(f"作者:{self.作者}") print(f"价格:{self.价格}元") # 创建实例 书1 = 书籍("Python编程:从入门到实践", "Eric Matthes", 89.0) 书2 = 书籍("小王子", "安托万·德·圣-埃克苏佩里", 29.5) 书1.显示信息() print("\n") 书2.显示信息() -
创建银行账户模板 :编写一个银行账户类,包含账户名、余额,以及"存款"、"取款"功能
python# 银行账户模板 class 银行账户: """银行账户模板""" def __init__(self, 账户名, 余额=0): """初始构造功能""" self.账户名 = 账户名 self.余额 = 余额 def 存款(self, 金额): """存款""" self.余额 += 金额 print(f"{self.账户名}存款{金额}元,当前余额:{self.余额}元") def 取款(self, 金额): """取款""" if 金额 <= self.余额: self.余额 -= 金额 print(f"{self.账户名}取款{金额}元,当前余额:{self.余额}元") else: print(f"余额不足,当前余额:{self.余额}元") def 显示信息(self): """显示账户信息""" print(f"账户名:{self.账户名}") print(f"当前余额:{self.余额}元") # 创建实例 账户1 = 银行账户("张三") 账户2 = 银行账户("李四", 1000) 账户1.存款(500) 账户1.取款(200) 账户1.显示信息() print("\n") 账户2.取款(1500) 账户2.取款(800) 账户2.显示信息()
挑战练习(拓展)
-
创建学生管理系统 :编写一个学生管理系统,包含添加学生、显示学生信息、计算平均分等功能
python# 学生管理系统 class 学生: """学生模板""" def __init__(self, 姓名, 年龄): """初始构造功能""" self.姓名 = 姓名 self.年龄 = 年龄 self.成绩字典 = {} def 添加成绩(self, 科目, 分数): """添加科目成绩""" self.成绩字典[科目] = 分数 def 计算平均分(self): """计算平均分""" if not self.成绩字典: return 0 return sum(self.成绩字典.values()) / len(self.成绩字典) def 显示信息(self): """显示学生信息""" print(f"姓名:{self.姓名}") print(f"年龄:{self.年龄}岁") print(f"成绩:{self.成绩字典}") print(f"平均分:{self.计算平均分():.2f}") class 学生管理系统: """学生管理系统""" def __init__(self): """初始构造功能""" self.学生列表 = [] def 添加学生(self, 学生): """添加学生""" self.学生列表.append(学生) print(f"添加学生{学生.姓名}成功!") def 显示所有学生(self): """显示所有学生信息""" if not self.学生列表: print("没有学生信息") return for i, 学生 in enumerate(self.学生列表, 1): print(f"\n第{i}个学生:") 学生.显示信息() def 计算班级平均分(self): """计算班级平均分""" if not self.学生列表: return 0 总分数 = 0 总科目数 = 0 for 学生 in self.学生列表: 总分数 += sum(学生.成绩字典.values()) 总科目数 += len(学生.成绩字典) if 总科目数 == 0: return 0 return 总分数 / 总科目数 # 测试学生管理系统 系统 = 学生管理系统() # 添加学生 学生1 = 学生("张三", 15) 学生1.添加成绩("数学", 95) 学生1.添加成绩("英语", 88) 学生1.添加成绩("语文", 92) 系统.添加学生(学生1) 学生2 = 学生("李四", 16) 学生2.添加成绩("数学", 85) 学生2.添加成绩("英语", 90) 系统.添加学生(学生2) # 显示所有学生 系统.显示所有学生() # 计算班级平均分 班级平均分 = 系统.计算班级平均分() print(f"\n班级平均分:{班级平均分:.2f}")
知识总结
核心概念回顾
- 类(模板):定义对象的属性和方法的蓝图
- 对象(实例):根据类创建的具体个体
- 属性(成员数据):对象的状态信息
- 方法(成员功能):对象的行为
- self参数:指向当前对象的引用
关键代码速查
| 功能 | 代码 | 说明 |
|---|---|---|
| 定义类 | class 类名: 代码块 |
定义一个类 |
| 初始化方法 | def __init__(self, 参数): 代码块 |
初始化对象的属性 |
| 创建对象 | 对象名 = 类名(参数) |
创建类的实例 |
| 访问属性 | 对象名.属性名 |
访问对象的属性 |
| 修改属性 | 对象名.属性名 = 值 |
修改对象的属性 |
| 定义方法 | def 方法名(self, 参数): 代码块 |
定义类的方法 |
| 调用方法 | 对象名.方法名(参数) |
调用对象的方法 |
常见错误提醒
- 缩进错误:类和方法的缩进不正确
- 参数错误 :
__init__方法的参数不匹配 - self参数:方法定义时忘记添加self参数
- 属性访问:访问不存在的属性
- 命名错误:类名或方法名拼写错误
课后作业
巩固练习题
- 编写一个手机类,包含品牌、型号、价格,以及"打电话"、"发短信"功能
- 编写一个电脑类,包含品牌、型号、内存,以及"开机"、"关机"功能
创意编程题
- 编写一个图书馆类,包含书籍列表,以及"添加书籍"、"借出书籍"、"归还书籍"功能
- 编写一个学校类,包含学生列表和教师列表,以及"添加学生"、"添加教师"、"显示信息"功能
下篇预习提示
在下一篇中,我们将深入学习__init__方法,了解如何在创建对象时初始化其属性。请思考:
- 如何在创建对象时设置默认值?
- 如何验证输入的参数?
- 如何在初始化时执行一些操作?
学习交流
如果你在学习过程中遇到任何问题,欢迎联系我:
- ** 视频号,"时空系"
- 邮箱: wbtm2718@qq.com
- 其他提示:
- 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
- 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流
祝你学习愉快!