面向对象分析与设计Python版 面向对象的核心特征
文章目录
- 一、封装
- 二、继承
- 三、多态
- 四、聚合/组合
- 五、接口/实现
- 六、抽象
一、封装
封装 Encapsulation
- 封装是隐藏对象实现细节的过程
- 内部状态通常不能被其他对象访问
- 对象的数据只能通过接口去访问
- 封装使得对象可以被看成一个“黑盒子”
- 它保护对象的内部状态不被其他对象破坏
- 一个对象实现方法的改变,不影响其他相关对象
- 对象间通过“接口”进行通信
封装内容
- 内部的、不想让其他人随意了解的信息
- 可以封装类的属性,如,“人” 这个类,封装个人的工资、资产、年龄等信息
- 可以封装类的方法,如, “人”如何赚钱()?如何消磨时间()?
封装目的
- 保护隐私
- 保护数据安全
- 隔离复杂度 (内部实现细节不对外公开)。如“空调”,封装了制冷的过程,对人提供了一个制冷的按钮
封装方式:Public、Private、Protected和Package
封装原则:对象应该只显示与其交互所需的接口。与对象的使用无关的细节应该对其他对象隐藏起来。
封装建议:设置属性的 getter 和 setter 方法,实现对数据的隐藏,因为其他对象不应该直接操作另一个对象中的数据。
class Student:
def __init__(self):
self._name = None
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
s = Student()
s.name = "张三" # 调用 setter
print(s.name) # 调用 getter,输出 张三
二、继承
继承 Inheritance
- 一个类获取另一个类的状态和行为,并添加额外的状态和行为
示例:喷气式飞机类继承飞机类
class Airplane:
def __init__(self):
self.speed = None
def get_speed(self):
return self.speed
def set_speed(self, speed):
self.speed = speed
class Jet(Airplane):
def __init__(self, multiplier=2):
super().__init__()
self.multiplier = multiplier # Super()和Super关键字用于引用超类
# 不需要定义get_speed()方法,它已继承过来
def set_speed(self, speed): # set_speed()方法覆盖了父类Airplane中的行为
return super().set_speed(speed * self.multiplier)
def accelerate(self): # 子类可以定义新的行为
super().set_speed(super().get_speed() * 2)
j = Jet()
j.set_speed(1000)
print(j.get_speed()) # 输出 2000
j.accelerate()
print(j.get_speed()) # 输出 4000
三、多态
多态 Polymorphism
- 当一个类从另一个类继承而来,多态使得子类可以代替父类
- 消息发送方不需要知道消息接收方属于那个子类
- 同一类族的接收者可以按自己的方式处理信息
- 同一类族的接受者可以按自己的方式处理同一个消息
- 可以有不同的对象以不同的方式处理相同的数据
多态的核心思想/设计模式的基础
- 使用指向父类的指针或者引用,能够调用子类的对象
- 示例:用shape分别引用Circle和Rectangle子类的对象
from abc import ABC, abstractmethod
class Shape(ABC):
def __init__(self):
self.area = None
@abstractmethod
def get_area(self):
pass
class Circle(Shape):
def __init__(self, r):
self.radius = r
def get_area(self):
return 3.14 * self.radius**2
class Rectangle(Shape):
def __init__(self, l, w):
self.length = l
self.width = w
def get_area(self):
return self.length * self.width
circle = Circle(5)
rectangle = Rectangle(4, 5)
lst = []
lst.append(circle)
lst.append(rectangle)
while len(lst) != 0:
shape: Shape = lst.pop()
print(f"面积:{shape.get_area()}") # 不必关心它是具体哪种形状
### 输出结果
面积:20
面积:78.5
四、聚合/组合
聚合/组合 Aggregation/Composition
-
聚合/组合,都是描述整体与部分的关系
-
聚合描述了一种“有”关系。一个对象是另一个对象的一部分,或者一个对象包含一组其他对象。
-
聚合关系是可传递的:如果A包含B, B包含C,那么A包含C。
-
聚合关系是不对称的:如果A包含B,那么B不包含A
-
组合是聚合关系的一个变种,是一种强依赖关系,表示部分和整体的生命周期是一致的,即部分不能脱离整体而单独存在。部分对象只能存在于整体对象之中,整体对象控制部分对象的生命周期。
-
有些时候,聚合与组合的关系不是很明确
五、接口/实现
接口/实现 Interface /Implementation
-
软件系统的内部是由大量的互相关联的类构成的。当对其中某一个类的局部进行修改的时候,不能影响其它的类
-
接口:描述一个类的用户如何与这个类交互
-
实现:完成接口所定义的功能、任务。
- 对实现的更改不应该要求对用户代码进行更改。
- 用户和实现都必须符合接口规范。
-
示例:TV是顾客、用户,插座是接口,发电厂是实现
六、抽象
抽象 Abstraction
- 抽象表示一个对象与其他所有对象相区别的基本特征,因此提供了同观察者角度有关的清晰定义的概念界限。
- 抽象是专注于最重要的方面而忽略次要细节的过程。使得我们可以通过专注于实体区别于其他实体的关键特征来有效管理(降低)复杂性
- 抽象就是过滤掉对象的一部分特性和操作,直到只剩下你所需要的属性和操作
抽象是一种思维方式、一种思维能力
- 抽象是面向对象领域发现类的主要方法
- 客观世界的事物由各种各样的实体(对象)构成,每个对象都有各自的内部状态和运动(状态)规律
- 根据对象的属性和运动规律的相似性可以将对象分类
- 复杂对象由相对简单的对象组成
- 不同对象的组合及其之间的相互作用和联系构成了系统
- 对象间的相互作用通过消息传递,对象根据所接收到的消息做出自身的反应
您正在阅读的是《面向对象分析与设计Python版》专栏!关注不迷路~