网站首页 > 技术文章 正文
我们在前面的所有代码设计和开发中均是面向过程的开发,而实际在相对来说稍稍大一点的项目或者说复杂点的代码,都是以面向对象的方式来进行程序设计。
什么是面向对象设计?
我们考虑现实世界,现实世界是以一个实体一个实体组成,比如人,车,花等等。面向对象的思想就是将一个概念实体以及他的相关动作封装在一起。这样,可以像现实世界一样,考虑不同实体之间的关系,来进行程序交互设计。
我们以 "人", 这个实体概念来看,如何进行面向对象设计?
一个人,他自己的基本属性,比如: 名字,身份证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数据类型的转换
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)