当前位置: 首页 > news >正文

面向对象分析与设计Python版 面向对象的核心特征

文章目录

    • 一、封装
    • 二、继承
    • 三、多态
    • 四、聚合/组合
    • 五、接口/实现
    • 六、抽象


一、封装

封装 Encapsulation

  • 封装是隐藏对象实现细节的过程
  • 内部状态通常不能被其他对象访问
  • 对象的数据只能通过接口去访问
  • 封装使得对象可以被看成一个“黑盒子”
  • 它保护对象的内部状态不被其他对象破坏
  • 一个对象实现方法的改变,不影响其他相关对象
  • 对象间通过“接口”进行通信

封装内容

  • 内部的、不想让其他人随意了解的信息
  • 可以封装类的属性,如,“人” 这个类,封装个人的工资、资产、年龄等信息
  • 可以封装类的方法,如, “人”如何赚钱()?如何消磨时间()?

封装目的

  • 保护隐私
  • 保护数据安全
  • 隔离复杂度 (内部实现细节不对外公开)。如“空调”,封装了制冷的过程,对人提供了一个制冷的按钮

封装方式:Public、Private、Protected和Package

封装原则:对象应该只显示与其交互所需的接口。与对象的使用无关的细节应该对其他对象隐藏起来。

封装建议:设置属性的 getter 和 setter 方法,实现对数据的隐藏,因为其他对象不应该直接操作另一个对象中的数据。

class Student:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = names = Student()
s.name = "张三"  # 调用 setter
print(s.name)  # 调用 getter,输出 张三

二、继承

继承 Inheritance

  • 一个类获取另一个类的状态和行为,并添加额外的状态和行为

示例:喷气式飞机类继承飞机类
在这里插入图片描述

class Airplane:def __init__(self):self.speed = Nonedef get_speed(self):return self.speeddef set_speed(self, speed):self.speed = speedclass 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, abstractmethodclass Shape(ABC):def __init__(self):self.area = None@abstractmethoddef get_area(self):passclass Circle(Shape):def __init__(self, r):self.radius = rdef get_area(self):return 3.14 * self.radius**2class Rectangle(Shape):def __init__(self, l, w):self.length = lself.width = wdef get_area(self):return self.length * self.widthcircle = 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版》专栏!关注不迷路~

相关文章:

面向对象分析与设计Python版 面向对象的核心特征

文章目录 一、封装二、继承三、多态四、聚合/组合五、接口/实现六、抽象 一、封装 封装 Encapsulation 封装是隐藏对象实现细节的过程内部状态通常不能被其他对象访问对象的数据只能通过接口去访问封装使得对象可以被看成一个“黑盒子”它保护对象的内部状态不被其他对象破坏…...

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件,这些组件可以组合成独特的解决方案。在选择密钥管理系统(KMS)时,您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...

RSA密码的安全性分析(简化版本)

RSA的安全性是基于分解大整数的困难性假定,之所以认为是假定是因为至今还未能证明大整数就是NP问题,也许有尚未发现的多项式时间分解算法。随着人类计算能力的不断提高,原来被认为是不可能分解的大数已经被成功分解。对于大整数的威胁除了人类…...

嵌入式linux系统中CMake的基本用法

第一:CMake的基本使用 在上篇文章中,我们聊了聊 Makefile。虽然它是 C/C++ 项目编译的“老司机”,但写起来真的是让人头大。尤其是当项目文件一多,手写依赖就像在搬砖,费时又费力。 那么问题来了,难道我们就没有更优雅的工具了吗?答案是:有! 这时候,CMake 就像一个…...

若依修改超级管理员admin的密码

通过接口方式或者页面 /system/user/resetPwd 需改其他用户的密码 修改其他用户的加密的密码,然后通过数据库将admin更新为这个密码就修改好了...

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…...

王佩丰24节Excel学习笔记——第二十四讲:宏表函数

【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 宏表函数不能直接使用。get.cell(参数一,参数二),参数一要参考类型表。 获得单元格的公式有很多种方法, 如:宏写法:get.cel…...

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕。2. 应用程序/启动台显示Navicat图标,表示安装成功。 二、运行测试运行后提示:“Navicat Premium.pp”已损坏&#x…...

现代光学基础2

yt2 目录 激光器概述红宝石激光器 工作原理主要特点举例说明 固体激光器 分类与特点钛-蓝宝石激光器锁模技术 光纤激光器 优势与应用掺铒光纤放大器(EDFA)隔离器与法拉第效应 气体激光器 常见类型工作原理举例说明 半导体激光器 现状与优势工作原理应用…...

Git 入门(一)

git 工作流如下: 命令如下: clone(克隆): 从远程仓库中克隆代码到本地仓库checkout (检出):从本地仓库中检出一个仓库分支然后进行修订add(添加): 在提交前先将代码提交到暂存区com…...

mysql自定义安装

1、下载安装包 我是在windows上安装,所以选择“Mysql Installer for Windows” 2、安装mysql 双击“mysql-installer-community-8.0.40.0.msi”,开始启动安装 这里选择安装项,这里只选择了两项。workbench是图形化管理工具,比较吃…...

微软自带日志输出+Serilog

安装两个 NuGet 包:Microsoft.Extensions.Logging,Serilog.AspNetCore 如何配置Program.cs,builder 具体如何配置自行解决: var builder WebApplication.CreateBuilder(args); builder.Logging.ClearProviders(); builder.Loggi…...

《PHP MySQL 创建数据库》

《PHP MySQL 创建数据库》 介绍 PHP是一种广泛使用的服务器端脚本语言,而MySQL是一种流行的关系型数据库管理系统。将PHP与MySQL结合使用,可以让您创建动态、交互式的网站。在本文中,我们将详细介绍如何使用PHP来创建MySQL数据库。 准备工…...

Python虚拟环境管理

Python管理虚拟环境主要是通过venv模块来完成的,这是Python标准库的一部分,因此不需要安装额外的包即可使用。以下是使用venv创建和管理虚拟环境的基本步骤: 创建虚拟环境 打开命令行界面(在Windows上是CMD或PowerShell&#xf…...

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片,并简单绘图。听上去似乎不难,但是实际操作下来,却不是非常的容易的。本文较为详细的描述了这个过程,供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…...

c++ vector 使用find查找指定元素方法

在 C 中&#xff0c;std::vector 是一个动态数组&#xff0c;用于存储同类型元素的序列。如果你想在 std::vector 中查找指定元素&#xff0c;可以使用 std::find 算法。std::find 是定义在 <algorithm> 头文件中的标准库函数。 以下是一个示例代码&#xff0c;展示了如…...

leetcode 732. 我的日程安排表 III

题目&#xff1a;732. 我的日程安排表 III - 力扣&#xff08;LeetCode&#xff09; 这个数据规模&#xff0c;暴力就够了 struct Book {int begin;int end;Book(int b, int e) {begin b;end e;} }; class MyCalendarThree { public:MyCalendarThree() {}int book(int star…...

k8s系列--docker拉取镜像导入k8s的containerd中

# 确认一下当前集群中正在运行的 Pod 和命名空间 kubectl get pods -A# 示例一&#xff1a;拉取并导入 CoreDNS 镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-hangzhou.aliyuncs.com/google_containers/cor…...

38-其他地方使用模式

38-其他地方使用模式 模式除了可以在 match 表达式中使用外&#xff0c;还可以使用在变量定义&#xff08;等号左侧是个模式&#xff09;和 for in 表达式&#xff08;for 关键字和 in 关键字之间是个模式&#xff09;中。 但是&#xff0c;并不是所有的模式都能使用在变量定…...

单片机按键扫描程序,可以单击、双击、长按,使用状态机,无延时,不阻塞。

根据按下时的时长、间隔来判断是否是连按或者长按。当连按间隔很短时&#xff0c;计录连按次数超过连接间隔时&#xff0c;回报按下次数根据按键次数自行判断是单击、双击、三击、四击。。。最多记录15击。 结构体版&#xff1a; #define KEY_CHANNEL_COUNT (6 8 8) struct…...

02国产大模型开源:华夏之光永存:华夏本源大模型——通用大模型整体架构设计与工程实现

华夏之光永存&#xff1a;华夏本源大模型——通用大模型整体架构设计与工程实现 一、架构核心定位与硬核基准 本篇为华夏本源大模型开源通用底座核心架构篇&#xff0c;说明逻辑硬核实操参数同步放出&#xff0c;公开内容严格对标GPT-3.5级别通用大模型全能力基准&#xff0c…...

专业的东莞高新技术企业认定资质办理公司

在当今竞争激烈的商业环境中&#xff0c;高新技术企业认定对于企业的发展至关重要。它不仅是企业技术实力的象征&#xff0c;还能带来一系列的政策优惠和发展机遇。在东莞&#xff0c;有众多企业希望通过高新技术企业认定来提升自身竞争力&#xff0c;而选择一家专业的办理公司…...

别再死记硬背Next数组了!用‘最长相等前后缀’这个核心概念,5分钟彻底搞懂KMP

从几何视角彻底理解KMP算法&#xff1a;Next数组的本质是字符串的自相似性 每次看到KMP算法中那个神秘的Next数组&#xff0c;总有种面对黑盒的感觉——明明代码只有几行&#xff0c;背后的逻辑却像被施了魔法。今天我们不谈公式推导&#xff0c;换个视角用"最长相等前后缀…...

科研党福音:Zotero 6.0 内置PDF阅读器+翻译插件,打造一站式文献阅读与笔记系统

Zotero 6.0 科研工作流革命&#xff1a;内置PDF生态与智能翻译实战指南 当你在深夜赶论文时&#xff0c;是否经历过这样的场景&#xff1a;PDF阅读器卡顿崩溃、翻译软件弹窗遮挡关键图表、文献批注散落在五个不同平台&#xff1f;Zotero 6.0的这次迭代&#xff0c;用原生PDF阅读…...

c++如何利用std--tie实现多个文件属性字段的快速比较排序【详解】

std::tie多字段排序需确保字段可比较、顺序一致且异常安全&#xff1a;字段类型须支持operator<&#xff0c;避免混用有符号/无符号或浮点精度问题&#xff1b;属性应预提取并兜底默认值&#xff0c;禁用可能抛异常的接口&#xff1b;跨平台时间比较需统一转为nanoseconds整…...

LangGraph 并行执行优化:如何提升多智能体任务处理效率?

第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 (Compelling Title) 主标题: LangGraph 并行执行优化:从单节点链式 → 百万级 Token 吞吐量的多智能体系统设计副标题: 解锁 ConditionalBranch、ParallelMap、AsyncAgent、StreamMode、Executor、…...

FPGA做PI控制,避开这3个坑:定点数、积分饱和与代码风格实战指南

FPGA实现PI控制的三大实战陷阱与避坑指南 当工程师们从MATLAB/Simulink的浮点仿真世界踏入FPGA的硬件实现领域时&#xff0c;往往会遭遇一系列意想不到的"暗礁"。我曾在一个电机控制项目中&#xff0c;花费整整两周时间才排查出一个由定点数溢出导致的PI控制器异常振…...

LabVIEW + Python 搞工业AI?手把手教你搭建一个轴承故障实时诊断系统(附CWRU数据集处理代码)

LabVIEW与Python协同实战&#xff1a;工业轴承故障诊断系统开发全流程解析 工业设备的状态监测与故障诊断正经历一场智能化革命。想象一下&#xff0c;当电机轴承出现早期故障征兆时&#xff0c;系统能在毫秒级完成信号采集、分析并触发预警——这种实时诊断能力对预防产线停机…...

提交的冲突解决:合并(merge)与变基(rebase)中的提交冲突处理

提交的冲突解决:合并(merge)与变基(rebase)中的提交冲突处理 昨天在调试一个嵌入式驱动时,遇到了一个典型场景:我本地的GPIO初始化代码刚改完,准备提交,结果发现队友已经把同一份文件的配置逻辑重构了。git pull 一下,终端里赫然跳出 CONFLICT (content) 的提示。这种时候…...

Vue项目中实现Excel样式无损导入:基于ExcelJS与x-spreadsheet的深度解析

1. 为什么需要Excel样式无损导入&#xff1f; 在企业级应用中&#xff0c;Excel文件作为数据交换的"通用语言"&#xff0c;经常需要与Web系统进行交互。但传统的数据导入往往只关注内容本身&#xff0c;丢失了字体、颜色、合并单元格等样式信息。这会导致两个核心问题…...