面向对象编程(OOP)in Python 1st

Python 基础

Posted by Hunter on April 8, 2023

面向对象编程(OOP)in Python 1st

面向对象编程是一种通过捆绑关联属性和行为到独立对象的,项目结构化的方法。在本课程中,你将会学习 Python 面向对象的基本编程方法。

从概念来说,对象类似于操作系统的一个组件。将程序想象为工厂的装配线,一个系统在装配线的每一步都要处理一些材料,最终将原材料转换为产品。

对象包含着数据,正如装配线中的每一环节中的原材料或者预处理材料。对象又包含着行为,就像装配线的组件所做的操作一样。

从本教程中,你将学会:

1、创建类,你可以理解为是对象的蓝图

2、使用类来创建对象

3、具有类继承的模型系统

什么是 Python 中的面向对象编程?

面向对象编程是一种能提供结构化程序方法的编程范式,结构化程序是指:将属性和操作绑定到单个对象上。

例如,一个对象应该表示一个具有如下属性的人:

  • 姓名
  • 年龄
  • 地址
  • 行为
  • 行走
  • 交谈
  • 呼吸
  • 奔跑

或者,如果是一个邮件对象,那么应该有如下属性:

  • 收件列表
  • 主题
  • 正文
  • 行为
  • 添加附件
  • 发送

换一种方式来说,面向对象编程是一种对模型的具象,具象的正是真实世界中的事物:比如车,或者事物之间的联系:比如公司和雇员,学生和老师等等。OOP将真实世界中的实体建模为包含数据并且具有某些特定行为的软件对象。

与此相对的,另外一种编程范式叫做“面向过程编程”,它构建的程序像是一个流程,其中包含着一组函数和代码块形式的特定的步骤,依次执行以完成任务。

关键要点在于:对象是Python中面向对象编程的核心,不仅像面向过程编程中那样,用来表示数据,而且在程序的整体结构中也是如此。

在Python中定义类:

原始的数据结构:数字、字符串、列表相对来说是用来表示简单的信息,比如一个苹果多少钱,这首诗的名字,或者你最喜欢的颜色等等。如果你想表示一些复杂信息呢?

例如,假设你想追踪一个组织中的雇员,你需要存储每个雇员的基本信息,比如其姓名、年龄、职位和工作年限。

使用列表来完成这一工作:

Hunter = ["Zhang", 24, "Engineer", 2275]
Mike = ["Hu", 26, "Engineer", 2297]
Trump = ["Donald", 74, "President", 5412]

用以上方法会有很大问题:

  • 生成大量难以管理的代码
  • 每个列表对象中的item数量可能不同,操作时产生大量异常

为了规避上述问题,我们使用类。在OOP中,我们经常听到“实例 (instance) 这个词,代表什么含义呢?”

类和实例的关系:

类被用于创建我们自定义的数据结构,类中定义的函数被叫做方法,这些方法标识了一个对象能够对其数据执行的行为和动作。

本教程中,我们将会创建一个Dog类,存储一只狗能够拥有的特性和行为。

类是事物被定义的蓝图,它本身并不存储着数据。狗类指定了定义狗时必须要定义姓名和年龄,但并不包含任何具体的狗的姓名和年龄。

既然类是蓝图,那么实例就类似于一张被填满信息的表格。正如每个人都可以在相同表格上填写个人独有的信息,许多实例也可以从单个类中创建出来。

如何定义一个类?

所有类的定义都以“class”关键字开始,其后跟着类名和冒号。任何在类定义下缩进的代码都被认为是类体的一部分。

class Dog:
    pass

类体中包含着一个声明:pass,这个声明用于占位,暗示着这里将来会有代码。用pass来占位,运行时Python就不会报错了。类名以大写字母开头。

这个狗类现在什么都没有。我们通过定义一些每只狗都会有的属性来充实它,比如姓名,年龄,毛色,品种。简单点,先用姓名和年龄。

所有狗都要有的属性必须要定义在一个叫做“.init()的方法中。每次新的狗对象被创建时.init()方法都要通过赋值对象的初始属性来设置初始状态。也就是说,.init() 初始化了类中的每个实例。

你可以给.init() 任意数量的参数,但是第一个参数永远应该是self, 当一个类的实例创建时,这个实例自动被传递给.init()方法中的 self 变量,这样,对象中的属性就被定义了。

让我们定义一个“可以生成拥有name,age的狗”的狗类。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

注意.init() 方法有四个空格的缩进,该方法内部的代码有8个空格缩进。这个缩进极其重要,代表了.init() 属于狗类。

.init() 方法内部,有两个使用 self 变量的声明:

  1. self.name = name 创建了名为 name 的属性,并为其指定name的值
  2. self.age = age 创建了名为age的属性,并为其指定age的值

.init() 中创建的属性被叫做实例属性,特定的实例有特定的实例属性值。所有的狗类都有姓名和年龄,但是在狗类的实例(具体某只狗)中,姓名和年龄是特定的。

在另一方面,类属性是类的所有实例化中相同的值,如下所示:

class Dog:
    # 类属性
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name
        self.age = age

类属性是在类名下面以4空格缩进直接定义的,必须有初始值。当一个类的实例被创建时,类的属性自动被创建,其类属性被指定初始值。

使用类属性来定义类的那些,对于所有类的实例都应相同的属性。比如所有的狗都有脑子。用实例属性来定义那些每个实例都可能不同的属性,比如狗的毛色。

我们有了狗类了,现在开始创建一些狗吧!