为女儿准备的编程课 Lesson9: Python 面向对象设计

Posted 会编程的熊爸爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为女儿准备的编程课 Lesson9: Python 面向对象设计相关的知识,希望对你有一定的参考价值。

我们在前面的所有代码设计和开发中均是面向过程的开发,而实际在相对来说稍稍大一点的项目或者说复杂点的代码,都是以面向对象的方式来进行程序设计。

什么是面向对象设计?

我们考虑现实世界,现实世界是以一个实体一个实体组成,比如人,车,花等等。面向对象的思想就是将一个概念实体以及他的相关动作封装在一起。这样,可以像现实世界一样,考虑不同实体之间的关系,来进行程序交互设计。

我们以 "人", 这个实体概念来看,如何进行面向对象设计?

一个人,他自己的基本属性,比如: 名字,身份证ID, 性别,年龄等;除了属性,还有一些人的基本能力,比如: 吃饭, 思考,走路。

一个人与另外一个人之间会有一些关系,比如,交朋友,结婚等。

现在,人和学校,就能产生一些关系,比如: 对于人来说是 "学习", 对于学校来说是 "招生" 等。

我们通过这些真实存在的实体概念,并建立每一个概念的属性以及能力,可以使得程序更具封装能力,同时,与其他实体概念解耦,更有助于大型程序的设计。

面向对象编程基本概念

我们了解什么是面向对象程序设计,那么,看看如何使用 python 代码来实现这些概念。我们依然以上面 "人" 为例子。

  1. 定义一个实体概念,叫做 类,用 class 关键字来表示
  2. 定义实体概念中的属性,叫类的属性或者成员,self.member 这种形式来表示
  3. 定义实体概念中的能力,叫类的成员函数,成员函数,可以直接使用类的属性,也就是 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 面向对象设计的主要内容,如果未能解决你的问题,请参考以下文章

为某网课准备的Topics

Python小白的数学建模课-01.新手必读

lesson9-小象学院cv

如何用python爬取米课最新课程

lesson9:分布式定时任务

会编程的少年有多厉害?8岁女儿写代码哄程序员爸爸开心,网友直呼:破防了