为女儿准备的编程课 Lesson9: Python 面向对象设计
Posted 会编程的熊爸爸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为女儿准备的编程课 Lesson9: Python 面向对象设计相关的知识,希望对你有一定的参考价值。
我们在前面的所有代码设计和开发中均是面向过程的开发,而实际在相对来说稍稍大一点的项目或者说复杂点的代码,都是以面向对象的方式来进行程序设计。
什么是面向对象设计?
我们考虑现实世界,现实世界是以一个实体一个实体组成,比如人,车,花等等。面向对象的思想就是将一个概念实体以及他的相关动作封装在一起。这样,可以像现实世界一样,考虑不同实体之间的关系,来进行程序交互设计。
我们以 "人", 这个实体概念来看,如何进行面向对象设计?
一个人,他自己的基本属性,比如: 名字,身份证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 绘制的面向对象程序设计。
总结
简单介绍了面向对象程序设计的基本概念,实际的面向对象设计是一套非常复杂需要很多实战的技能,这其中就包括: 设计模式。设计模式这部分过于庞大和复杂,就不在这里介绍了。
以上是关于为女儿准备的编程课 Lesson9: Python 面向对象设计的主要内容,如果未能解决你的问题,请参考以下文章