网站首页 > 技术文章 正文
我们在前面的所有代码设计和开发中均是面向过程的开发,而实际在相对来说稍稍大一点的项目或者说复杂点的代码,都是以面向对象的方式来进行程序设计。
什么是面向对象设计?
我们考虑现实世界,现实世界是以一个实体一个实体组成,比如人,车,花等等。面向对象的思想就是将一个概念实体以及他的相关动作封装在一起。这样,可以像现实世界一样,考虑不同实体之间的关系,来进行程序交互设计。
我们以 "人", 这个实体概念来看,如何进行面向对象设计?
一个人,他自己的基本属性,比如: 名字,身份证ID, 性别,年龄等;除了属性,还有一些人的基本能力,比如: 吃饭, 思考,走路。
一个人与另外一个人之间会有一些关系,比如,交朋友,结婚等。
我们在定义更多的客观概念,例如: 学校。学校的属性: 学校名字,学校地址。
现在,人和学校,就能产生一些关系,比如: 对于人来说是 "学习", 对于学校来说是 "招生" 等。
我们通过这些真实存在的实体概念,并建立每一个概念的属性以及能力,可以使得程序更具封装能力,同时,与其他实体概念解耦,更有助于大型程序的设计。
面向对象编程基本概念
我们了解什么是面向对象程序设计,那么,看看如何使用 python 代码来实现这些概念。我们依然以上面 "人" 为例子。
- 定义一个实体概念,叫做 类,用 class 关键字来表示
- 定义实体概念中的属性,叫类的属性或者成员,self.member 这种形式来表示
- 定义实体概念中的能力,叫类的成员函数,成员函数,可以直接使用类的属性,也就是 self.member 形式的属性。
接下来我们编写一个"人"的类。
from typing import List
class Person:
"""
人
"""
def __init__(self, id_no: str, name: str, age: int, sex: str):
"""
初始化 人的属性
:param id_no: 身份证 id
:param name: 名字
:param age: 年龄
:param sex: 性别
"""
self.id_no = id_no
self.name = name
self.age = age
self.sex = sex
self.school: "School" = None
def eat(self, some_thing: str):
"""
吃东西
:param some_thing: 吃的东西
:return:
"""
return f"我吃了: {some_thing}"
def study(self, school: "School"):
self.school = school
def introduce(self):
"""
自我介绍
:return:
"""
return f"我是{self.name}, 今年{self.age}岁, 性别{self.sex}"
class School:
"""
学校
"""
def __init__(self, name: str, address: str):
"""
学校
:param name: 学校名字
:param address: 地址
"""
self.name = name
self.address = address
self.students : List[Person] = list()
def enroll_student(self, student: Person):
"""
招生
:param student: 学生
:return:
"""
self.students.append(student)
我们先测试下学生:
zhangsan = Person(id_no="1", name="张三", age=10, sex="男")
print(zhangsan.introduce())
lisi = Person(id_no="2", name="李四", age=8, sex="男")
print(lisi.introduce())
我是张三, 今年10岁, 性别男
我是李四, 今年8岁, 性别男
在测试下学校:
school = School(name="python中学", address="python3.7")
school.enroll_student(student=zhangsan)
school.enroll_student(student=lisi)
print(f"学校里的学生有: {len(school.students)} 名")
for student in school.students:
print(f"学校的学生: {student.name}")
学校里的学生有: 2 名
学校的学生: 张三
学校的学生: 李四
我们看到学生和学校都被很好的封装在一起,并且能够交互。这就是面向对象程序设计。
类之间的关系
类与类之间的最重要的关系是继承。继承表示子类能够获得父类的能力,并且可以重写,并且加入更多的特性。
例如上面的例子,我们定义一个学生类,作为学校的学生,继承自 Person, 增加一个学号的属性。
class Student(Person):
"""
学生
"""
def __init__(self, student_no: str, id_no: str, name: str, age: int, sex: str):
"""
学生
:param student_no: 学号
"""
super().__init__(id_no=id_no, name=name, age=age, sex=sex)
self.student_no = student_no
def introduce(self):
return f"{super().introduce()}, 学号是: {self.student_no}"
面向对象程序设计工具-UML
我们看到类有成员有函数,以及类之间的关系,以及对象和对象之间的交互,那么在进行面向对象程序设计的时候,我们需要一些工具来描述这些方面。
这种语言是 UML。下面是我们用 UML 绘制的面向对象程序设计。
总结
简单介绍了面向对象程序设计的基本概念,实际的面向对象设计是一套非常复杂需要很多实战的技能,这其中就包括: 设计模式。设计模式这部分过于庞大和复杂,就不在这里介绍了。
猜你喜欢
- 2024-12-02 「第2周」Python基本图形绘制 实例3——turtle五角星绘制
- 2024-12-02 「Python条件结构」将两个数从小到大输出
- 2024-12-02 Python包中__init__.py文件的作用和用法
- 2024-12-02 Python 报错 Int Object is Not Iterable 的解决办法
- 2024-12-02 分享一个Python实例脚本--如何判断输入日期是第几天
- 2024-12-02 python编程 石头剪刀布游戏,练手题目
- 2024-12-02 Python每日一练之打印所有水仙花数
- 2024-12-02 [oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
- 2024-12-02 零基础学python第七天之随机整数randint
- 2024-12-02 Python数据类型的转换
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 530℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 493℃MySQL service启动脚本浅析(r12笔记第59天)
- 473℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 470℃启用MySQL查询缓存(mysql8.0查询缓存)
- 451℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 430℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 427℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)