软件工程:类和实例

📌目录



⚖️ 类和实例:面向对象的核心概念

类(Class)和实例(Instance)是面向对象技术的核心概念。类是对象的模板,实例是类的具体化。本文将详细介绍类和实例的概念、组成、关系以及设计原则。

🎯 一、类概述

(一)类的定义

是对象的模板,定义了对象的属性和方法,是一组具有相同属性和行为的对象的抽象。

类概念
#mermaid-svg-EUFg0SW1XdIjHUY9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EUFg0SW1XdIjHUY9 .error-icon{fill:#552222;}#mermaid-svg-EUFg0SW1XdIjHUY9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EUFg0SW1XdIjHUY9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .marker.cross{stroke:#333333;}#mermaid-svg-EUFg0SW1XdIjHUY9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EUFg0SW1XdIjHUY9 p{margin:0;}#mermaid-svg-EUFg0SW1XdIjHUY9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster-label text{fill:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster-label span{color:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster-label span p{background-color:transparent;}#mermaid-svg-EUFg0SW1XdIjHUY9 .label text,#mermaid-svg-EUFg0SW1XdIjHUY9 span{fill:#333;color:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .node rect,#mermaid-svg-EUFg0SW1XdIjHUY9 .node circle,#mermaid-svg-EUFg0SW1XdIjHUY9 .node ellipse,#mermaid-svg-EUFg0SW1XdIjHUY9 .node polygon,#mermaid-svg-EUFg0SW1XdIjHUY9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .rough-node .label text,#mermaid-svg-EUFg0SW1XdIjHUY9 .node .label text,#mermaid-svg-EUFg0SW1XdIjHUY9 .image-shape .label,#mermaid-svg-EUFg0SW1XdIjHUY9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EUFg0SW1XdIjHUY9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .rough-node .label,#mermaid-svg-EUFg0SW1XdIjHUY9 .node .label,#mermaid-svg-EUFg0SW1XdIjHUY9 .image-shape .label,#mermaid-svg-EUFg0SW1XdIjHUY9 .icon-shape .label{text-align:center;}#mermaid-svg-EUFg0SW1XdIjHUY9 .node.clickable{cursor:pointer;}#mermaid-svg-EUFg0SW1XdIjHUY9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .arrowheadPath{fill:#333333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EUFg0SW1XdIjHUY9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EUFg0SW1XdIjHUY9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EUFg0SW1XdIjHUY9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster text{fill:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 .cluster span{color:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EUFg0SW1XdIjHUY9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EUFg0SW1XdIjHUY9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EUFg0SW1XdIjHUY9 .icon-shape,#mermaid-svg-EUFg0SW1XdIjHUY9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EUFg0SW1XdIjHUY9 .icon-shape p,#mermaid-svg-EUFg0SW1XdIjHUY9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EUFg0SW1XdIjHUY9 .icon-shape .label rect,#mermaid-svg-EUFg0SW1XdIjHUY9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EUFg0SW1XdIjHUY9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EUFg0SW1XdIjHUY9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EUFg0SW1XdIjHUY9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 类
模板
抽象
定义
创建对象
抽取共性
定义属性和方法

(二)类的本质

类本质

类是对现实世界实体的抽象,提取了实体的共同特征和行为。

类本质
#mermaid-svg-CGIt30o4gGWEvof3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CGIt30o4gGWEvof3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CGIt30o4gGWEvof3 .error-icon{fill:#552222;}#mermaid-svg-CGIt30o4gGWEvof3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CGIt30o4gGWEvof3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CGIt30o4gGWEvof3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CGIt30o4gGWEvof3 .marker.cross{stroke:#333333;}#mermaid-svg-CGIt30o4gGWEvof3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CGIt30o4gGWEvof3 p{margin:0;}#mermaid-svg-CGIt30o4gGWEvof3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CGIt30o4gGWEvof3 .cluster-label text{fill:#333;}#mermaid-svg-CGIt30o4gGWEvof3 .cluster-label span{color:#333;}#mermaid-svg-CGIt30o4gGWEvof3 .cluster-label span p{background-color:transparent;}#mermaid-svg-CGIt30o4gGWEvof3 .label text,#mermaid-svg-CGIt30o4gGWEvof3 span{fill:#333;color:#333;}#mermaid-svg-CGIt30o4gGWEvof3 .node rect,#mermaid-svg-CGIt30o4gGWEvof3 .node circle,#mermaid-svg-CGIt30o4gGWEvof3 .node ellipse,#mermaid-svg-CGIt30o4gGWEvof3 .node polygon,#mermaid-svg-CGIt30o4gGWEvof3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CGIt30o4gGWEvof3 .rough-node .label text,#mermaid-svg-CGIt30o4gGWEvof3 .node .label text,#mermaid-svg-CGIt30o4gGWEvof3 .image-shape .label,#mermaid-svg-CGIt30o4gGWEvof3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-CGIt30o4gGWEvof3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CGIt30o4gGWEvof3 .rough-node .label,#mermaid-svg-CGIt30o4gGWEvof3 .node .label,#mermaid-svg-CGIt30o4gGWEvof3 .image-shape .label,#mermaid-svg-CGIt30o4gGWEvof3 .icon-shape .label{text-align:center;}#mermaid-svg-CGIt30o4gGWEvof3 .node.clickable{cursor:pointer;}#mermaid-svg-CGIt30o4gGWEvof3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CGIt30o4gGWEvof3 .arrowheadPath{fill:#333333;}#mermaid-svg-CGIt30o4gGWEvof3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CGIt30o4gGWEvof3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CGIt30o4gGWEvof3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CGIt30o4gGWEvof3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CGIt30o4gGWEvof3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CGIt30o4gGWEvof3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CGIt30o4gGWEvof3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CGIt30o4gGWEvof3 .cluster text{fill:#333;}#mermaid-svg-CGIt30o4gGWEvof3 .cluster span{color:#333;}#mermaid-svg-CGIt30o4gGWEvof3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CGIt30o4gGWEvof3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CGIt30o4gGWEvof3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-CGIt30o4gGWEvof3 .icon-shape,#mermaid-svg-CGIt30o4gGWEvof3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CGIt30o4gGWEvof3 .icon-shape p,#mermaid-svg-CGIt30o4gGWEvof3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CGIt30o4gGWEvof3 .icon-shape .label rect,#mermaid-svg-CGIt30o4gGWEvof3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CGIt30o4gGWEvof3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CGIt30o4gGWEvof3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CGIt30o4gGWEvof3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 现实世界实体
抽象
提取共性
定义类
属性
方法
共同特征
共同行为

(三)类的特点

类特点

特点 说明
抽象性 抽取共同特征
模板性 创建对象的模板
封装性 封装属性和方法
继承性 支持继承机制
多态性 支持多态机制

📦 二、类的组成

(一)类的组成要素

组成要素
#mermaid-svg-vXdXaiqPZ2SixiYP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vXdXaiqPZ2SixiYP .error-icon{fill:#552222;}#mermaid-svg-vXdXaiqPZ2SixiYP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vXdXaiqPZ2SixiYP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vXdXaiqPZ2SixiYP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vXdXaiqPZ2SixiYP .marker.cross{stroke:#333333;}#mermaid-svg-vXdXaiqPZ2SixiYP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vXdXaiqPZ2SixiYP p{margin:0;}#mermaid-svg-vXdXaiqPZ2SixiYP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster-label text{fill:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster-label span{color:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster-label span p{background-color:transparent;}#mermaid-svg-vXdXaiqPZ2SixiYP .label text,#mermaid-svg-vXdXaiqPZ2SixiYP span{fill:#333;color:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP .node rect,#mermaid-svg-vXdXaiqPZ2SixiYP .node circle,#mermaid-svg-vXdXaiqPZ2SixiYP .node ellipse,#mermaid-svg-vXdXaiqPZ2SixiYP .node polygon,#mermaid-svg-vXdXaiqPZ2SixiYP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vXdXaiqPZ2SixiYP .rough-node .label text,#mermaid-svg-vXdXaiqPZ2SixiYP .node .label text,#mermaid-svg-vXdXaiqPZ2SixiYP .image-shape .label,#mermaid-svg-vXdXaiqPZ2SixiYP .icon-shape .label{text-anchor:middle;}#mermaid-svg-vXdXaiqPZ2SixiYP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vXdXaiqPZ2SixiYP .rough-node .label,#mermaid-svg-vXdXaiqPZ2SixiYP .node .label,#mermaid-svg-vXdXaiqPZ2SixiYP .image-shape .label,#mermaid-svg-vXdXaiqPZ2SixiYP .icon-shape .label{text-align:center;}#mermaid-svg-vXdXaiqPZ2SixiYP .node.clickable{cursor:pointer;}#mermaid-svg-vXdXaiqPZ2SixiYP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vXdXaiqPZ2SixiYP .arrowheadPath{fill:#333333;}#mermaid-svg-vXdXaiqPZ2SixiYP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vXdXaiqPZ2SixiYP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vXdXaiqPZ2SixiYP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vXdXaiqPZ2SixiYP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vXdXaiqPZ2SixiYP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vXdXaiqPZ2SixiYP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster text{fill:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP .cluster span{color:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vXdXaiqPZ2SixiYP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vXdXaiqPZ2SixiYP rect.text{fill:none;stroke-width:0;}#mermaid-svg-vXdXaiqPZ2SixiYP .icon-shape,#mermaid-svg-vXdXaiqPZ2SixiYP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vXdXaiqPZ2SixiYP .icon-shape p,#mermaid-svg-vXdXaiqPZ2SixiYP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vXdXaiqPZ2SixiYP .icon-shape .label rect,#mermaid-svg-vXdXaiqPZ2SixiYP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vXdXaiqPZ2SixiYP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vXdXaiqPZ2SixiYP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vXdXaiqPZ2SixiYP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 类组成
属性
方法
构造函数
析构函数
数据成员
操作方法
初始化
清理资源

(二)属性

属性是类的数据成员,描述类的特征。

属性概念
#mermaid-svg-LcS1M9KhxbTUMNQa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LcS1M9KhxbTUMNQa .error-icon{fill:#552222;}#mermaid-svg-LcS1M9KhxbTUMNQa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LcS1M9KhxbTUMNQa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LcS1M9KhxbTUMNQa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LcS1M9KhxbTUMNQa .marker.cross{stroke:#333333;}#mermaid-svg-LcS1M9KhxbTUMNQa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LcS1M9KhxbTUMNQa p{margin:0;}#mermaid-svg-LcS1M9KhxbTUMNQa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster-label text{fill:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster-label span{color:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster-label span p{background-color:transparent;}#mermaid-svg-LcS1M9KhxbTUMNQa .label text,#mermaid-svg-LcS1M9KhxbTUMNQa span{fill:#333;color:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa .node rect,#mermaid-svg-LcS1M9KhxbTUMNQa .node circle,#mermaid-svg-LcS1M9KhxbTUMNQa .node ellipse,#mermaid-svg-LcS1M9KhxbTUMNQa .node polygon,#mermaid-svg-LcS1M9KhxbTUMNQa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LcS1M9KhxbTUMNQa .rough-node .label text,#mermaid-svg-LcS1M9KhxbTUMNQa .node .label text,#mermaid-svg-LcS1M9KhxbTUMNQa .image-shape .label,#mermaid-svg-LcS1M9KhxbTUMNQa .icon-shape .label{text-anchor:middle;}#mermaid-svg-LcS1M9KhxbTUMNQa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LcS1M9KhxbTUMNQa .rough-node .label,#mermaid-svg-LcS1M9KhxbTUMNQa .node .label,#mermaid-svg-LcS1M9KhxbTUMNQa .image-shape .label,#mermaid-svg-LcS1M9KhxbTUMNQa .icon-shape .label{text-align:center;}#mermaid-svg-LcS1M9KhxbTUMNQa .node.clickable{cursor:pointer;}#mermaid-svg-LcS1M9KhxbTUMNQa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LcS1M9KhxbTUMNQa .arrowheadPath{fill:#333333;}#mermaid-svg-LcS1M9KhxbTUMNQa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LcS1M9KhxbTUMNQa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LcS1M9KhxbTUMNQa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LcS1M9KhxbTUMNQa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LcS1M9KhxbTUMNQa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LcS1M9KhxbTUMNQa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster text{fill:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa .cluster span{color:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LcS1M9KhxbTUMNQa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LcS1M9KhxbTUMNQa rect.text{fill:none;stroke-width:0;}#mermaid-svg-LcS1M9KhxbTUMNQa .icon-shape,#mermaid-svg-LcS1M9KhxbTUMNQa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LcS1M9KhxbTUMNQa .icon-shape p,#mermaid-svg-LcS1M9KhxbTUMNQa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LcS1M9KhxbTUMNQa .icon-shape .label rect,#mermaid-svg-LcS1M9KhxbTUMNQa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LcS1M9KhxbTUMNQa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LcS1M9KhxbTUMNQa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LcS1M9KhxbTUMNQa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 属性
类属性
实例属性
所有对象共享
每个对象独立

属性示例

python 复制代码
class Student:
    # 类属性(所有对象共享)
    school = "清华大学"
    count = 0
    
    def __init__(self, name, age):
        # 实例属性(每个对象独立)
        self.name = name
        self.age = age
        Student.count += 1  # 修改类属性

# 创建对象
student1 = Student("张三", 20)
student2 = Student("李四", 21)

# 访问属性
print(student1.school)  # 输出:清华大学
print(student2.school)  # 输出:清华大学
print(Student.school)   # 输出:清华大学

print(student1.name)    # 输出:张三
print(student2.name)    # 输出:李四

print(Student.count)    # 输出:2

(三)方法

方法是类的操作行为,描述类能做什么。

方法概念
#mermaid-svg-8IE5mqxkbfDMs3vQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8IE5mqxkbfDMs3vQ .error-icon{fill:#552222;}#mermaid-svg-8IE5mqxkbfDMs3vQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8IE5mqxkbfDMs3vQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .marker.cross{stroke:#333333;}#mermaid-svg-8IE5mqxkbfDMs3vQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8IE5mqxkbfDMs3vQ p{margin:0;}#mermaid-svg-8IE5mqxkbfDMs3vQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster-label text{fill:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster-label span{color:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster-label span p{background-color:transparent;}#mermaid-svg-8IE5mqxkbfDMs3vQ .label text,#mermaid-svg-8IE5mqxkbfDMs3vQ span{fill:#333;color:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .node rect,#mermaid-svg-8IE5mqxkbfDMs3vQ .node circle,#mermaid-svg-8IE5mqxkbfDMs3vQ .node ellipse,#mermaid-svg-8IE5mqxkbfDMs3vQ .node polygon,#mermaid-svg-8IE5mqxkbfDMs3vQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .rough-node .label text,#mermaid-svg-8IE5mqxkbfDMs3vQ .node .label text,#mermaid-svg-8IE5mqxkbfDMs3vQ .image-shape .label,#mermaid-svg-8IE5mqxkbfDMs3vQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-8IE5mqxkbfDMs3vQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .rough-node .label,#mermaid-svg-8IE5mqxkbfDMs3vQ .node .label,#mermaid-svg-8IE5mqxkbfDMs3vQ .image-shape .label,#mermaid-svg-8IE5mqxkbfDMs3vQ .icon-shape .label{text-align:center;}#mermaid-svg-8IE5mqxkbfDMs3vQ .node.clickable{cursor:pointer;}#mermaid-svg-8IE5mqxkbfDMs3vQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .arrowheadPath{fill:#333333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8IE5mqxkbfDMs3vQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8IE5mqxkbfDMs3vQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8IE5mqxkbfDMs3vQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster text{fill:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ .cluster span{color:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8IE5mqxkbfDMs3vQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8IE5mqxkbfDMs3vQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-8IE5mqxkbfDMs3vQ .icon-shape,#mermaid-svg-8IE5mqxkbfDMs3vQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8IE5mqxkbfDMs3vQ .icon-shape p,#mermaid-svg-8IE5mqxkbfDMs3vQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8IE5mqxkbfDMs3vQ .icon-shape .label rect,#mermaid-svg-8IE5mqxkbfDMs3vQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8IE5mqxkbfDMs3vQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8IE5mqxkbfDMs3vQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8IE5mqxkbfDMs3vQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 方法
实例方法
类方法
静态方法
操作实例属性
操作类属性
不操作属性

方法示例

python 复制代码
class Student:
    school = "清华大学"
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 实例方法
    def get_info(self):
        """获取学生信息"""
        return f"{self.name}, {self.age}岁"
    
    # 类方法
    @classmethod
    def get_school(cls):
        """获取学校名称"""
        return cls.school
    
    @classmethod
    def change_school(cls, new_school):
        """修改学校名称"""
        cls.school = new_school
    
    # 静态方法
    @staticmethod
    def is_adult(age):
        """判断是否成年"""
        return age >= 18

# 使用
student = Student("张三", 20)

# 实例方法
print(student.get_info())  # 输出:张三, 20岁

# 类方法
print(Student.get_school())  # 输出:清华大学
Student.change_school("北京大学")
print(student.get_school())  # 输出:北京大学

# 静态方法
print(Student.is_adult(20))  # 输出:True

(四)构造函数

构造函数是创建对象时自动调用的方法,用于初始化对象。

构造函数概念
#mermaid-svg-SGRRJgKTjIrBixnI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SGRRJgKTjIrBixnI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SGRRJgKTjIrBixnI .error-icon{fill:#552222;}#mermaid-svg-SGRRJgKTjIrBixnI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SGRRJgKTjIrBixnI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SGRRJgKTjIrBixnI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SGRRJgKTjIrBixnI .marker.cross{stroke:#333333;}#mermaid-svg-SGRRJgKTjIrBixnI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SGRRJgKTjIrBixnI p{margin:0;}#mermaid-svg-SGRRJgKTjIrBixnI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SGRRJgKTjIrBixnI .cluster-label text{fill:#333;}#mermaid-svg-SGRRJgKTjIrBixnI .cluster-label span{color:#333;}#mermaid-svg-SGRRJgKTjIrBixnI .cluster-label span p{background-color:transparent;}#mermaid-svg-SGRRJgKTjIrBixnI .label text,#mermaid-svg-SGRRJgKTjIrBixnI span{fill:#333;color:#333;}#mermaid-svg-SGRRJgKTjIrBixnI .node rect,#mermaid-svg-SGRRJgKTjIrBixnI .node circle,#mermaid-svg-SGRRJgKTjIrBixnI .node ellipse,#mermaid-svg-SGRRJgKTjIrBixnI .node polygon,#mermaid-svg-SGRRJgKTjIrBixnI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SGRRJgKTjIrBixnI .rough-node .label text,#mermaid-svg-SGRRJgKTjIrBixnI .node .label text,#mermaid-svg-SGRRJgKTjIrBixnI .image-shape .label,#mermaid-svg-SGRRJgKTjIrBixnI .icon-shape .label{text-anchor:middle;}#mermaid-svg-SGRRJgKTjIrBixnI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SGRRJgKTjIrBixnI .rough-node .label,#mermaid-svg-SGRRJgKTjIrBixnI .node .label,#mermaid-svg-SGRRJgKTjIrBixnI .image-shape .label,#mermaid-svg-SGRRJgKTjIrBixnI .icon-shape .label{text-align:center;}#mermaid-svg-SGRRJgKTjIrBixnI .node.clickable{cursor:pointer;}#mermaid-svg-SGRRJgKTjIrBixnI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SGRRJgKTjIrBixnI .arrowheadPath{fill:#333333;}#mermaid-svg-SGRRJgKTjIrBixnI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SGRRJgKTjIrBixnI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SGRRJgKTjIrBixnI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SGRRJgKTjIrBixnI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SGRRJgKTjIrBixnI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SGRRJgKTjIrBixnI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SGRRJgKTjIrBixnI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SGRRJgKTjIrBixnI .cluster text{fill:#333;}#mermaid-svg-SGRRJgKTjIrBixnI .cluster span{color:#333;}#mermaid-svg-SGRRJgKTjIrBixnI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SGRRJgKTjIrBixnI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SGRRJgKTjIrBixnI rect.text{fill:none;stroke-width:0;}#mermaid-svg-SGRRJgKTjIrBixnI .icon-shape,#mermaid-svg-SGRRJgKTjIrBixnI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SGRRJgKTjIrBixnI .icon-shape p,#mermaid-svg-SGRRJgKTjIrBixnI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SGRRJgKTjIrBixnI .icon-shape .label rect,#mermaid-svg-SGRRJgKTjIrBixnI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SGRRJgKTjIrBixnI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SGRRJgKTjIrBixnI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SGRRJgKTjIrBixnI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 构造函数
初始化对象
分配资源
设置初始值
创建时调用
分配内存
设置属性

构造函数示例

python 复制代码
class Student:
    # 构造函数
    def __init__(self, name, age, major="未定"):
        self.name = name
        self.age = age
        self.major = major
        self.courses = []
        print(f"创建学生:{name}")
    
    def get_info(self):
        return f"{self.name}, {self.age}岁, {self.major}"

# 创建对象时自动调用构造函数
student1 = Student("张三", 20)  # 创建学生:张三
student2 = Student("李四", 21, "计算机科学")  # 创建学生:李四

print(student1.get_info())  # 输出:张三, 20岁, 未定
print(student2.get_info())  # 输出:李四, 21岁, 计算机科学

(五)析构函数

析构函数是对象销毁时自动调用的方法,用于清理资源。

析构函数概念
#mermaid-svg-fTy510AsPrlDoTIN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fTy510AsPrlDoTIN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fTy510AsPrlDoTIN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fTy510AsPrlDoTIN .error-icon{fill:#552222;}#mermaid-svg-fTy510AsPrlDoTIN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fTy510AsPrlDoTIN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fTy510AsPrlDoTIN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fTy510AsPrlDoTIN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fTy510AsPrlDoTIN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fTy510AsPrlDoTIN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fTy510AsPrlDoTIN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fTy510AsPrlDoTIN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fTy510AsPrlDoTIN .marker.cross{stroke:#333333;}#mermaid-svg-fTy510AsPrlDoTIN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fTy510AsPrlDoTIN p{margin:0;}#mermaid-svg-fTy510AsPrlDoTIN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fTy510AsPrlDoTIN .cluster-label text{fill:#333;}#mermaid-svg-fTy510AsPrlDoTIN .cluster-label span{color:#333;}#mermaid-svg-fTy510AsPrlDoTIN .cluster-label span p{background-color:transparent;}#mermaid-svg-fTy510AsPrlDoTIN .label text,#mermaid-svg-fTy510AsPrlDoTIN span{fill:#333;color:#333;}#mermaid-svg-fTy510AsPrlDoTIN .node rect,#mermaid-svg-fTy510AsPrlDoTIN .node circle,#mermaid-svg-fTy510AsPrlDoTIN .node ellipse,#mermaid-svg-fTy510AsPrlDoTIN .node polygon,#mermaid-svg-fTy510AsPrlDoTIN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fTy510AsPrlDoTIN .rough-node .label text,#mermaid-svg-fTy510AsPrlDoTIN .node .label text,#mermaid-svg-fTy510AsPrlDoTIN .image-shape .label,#mermaid-svg-fTy510AsPrlDoTIN .icon-shape .label{text-anchor:middle;}#mermaid-svg-fTy510AsPrlDoTIN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fTy510AsPrlDoTIN .rough-node .label,#mermaid-svg-fTy510AsPrlDoTIN .node .label,#mermaid-svg-fTy510AsPrlDoTIN .image-shape .label,#mermaid-svg-fTy510AsPrlDoTIN .icon-shape .label{text-align:center;}#mermaid-svg-fTy510AsPrlDoTIN .node.clickable{cursor:pointer;}#mermaid-svg-fTy510AsPrlDoTIN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fTy510AsPrlDoTIN .arrowheadPath{fill:#333333;}#mermaid-svg-fTy510AsPrlDoTIN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fTy510AsPrlDoTIN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fTy510AsPrlDoTIN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fTy510AsPrlDoTIN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fTy510AsPrlDoTIN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fTy510AsPrlDoTIN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fTy510AsPrlDoTIN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fTy510AsPrlDoTIN .cluster text{fill:#333;}#mermaid-svg-fTy510AsPrlDoTIN .cluster span{color:#333;}#mermaid-svg-fTy510AsPrlDoTIN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fTy510AsPrlDoTIN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fTy510AsPrlDoTIN rect.text{fill:none;stroke-width:0;}#mermaid-svg-fTy510AsPrlDoTIN .icon-shape,#mermaid-svg-fTy510AsPrlDoTIN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fTy510AsPrlDoTIN .icon-shape p,#mermaid-svg-fTy510AsPrlDoTIN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fTy510AsPrlDoTIN .icon-shape .label rect,#mermaid-svg-fTy510AsPrlDoTIN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fTy510AsPrlDoTIN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fTy510AsPrlDoTIN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fTy510AsPrlDoTIN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 析构函数
清理资源
释放内存
关闭连接
销毁时调用
释放资源
关闭文件

析构函数示例

python 复制代码
class FileHandler:
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, 'w')
        print(f"打开文件:{filename}")
    
    def write(self, content):
        self.file.write(content)
    
    # 析构函数
    def __del__(self):
        self.file.close()
        print(f"关闭文件:{self.filename}")

# 使用
handler = FileHandler("test.txt")
handler.write("Hello, World!")

# 对象销毁时自动调用析构函数
del handler  # 关闭文件:test.txt

🌐 三、类的类型

(一)按抽象程度分类

按抽象程度分类

类型 说明 示例
抽象类 不能实例化 Animal
具体类 可以实例化 Dog, Cat
接口类 定义接口 Drawable

(二)抽象类

抽象类是不能实例化的类,用于定义子类必须实现的方法。

抽象类示例

python 复制代码
from abc import ABC, abstractmethod

# 抽象类
class Shape(ABC):
    @abstractmethod
    def area(self):
        """计算面积(抽象方法)"""
        pass
    
    @abstractmethod
    def display(self):
        """显示图形(抽象方法)"""
        pass
    
    # 具体方法
    def get_info(self):
        return f"面积是:{self.area()}"

# 具体类
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2
    
    def display(self):
        print(f"圆形,半径:{self.radius}")

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def display(self):
        print(f"矩形,宽:{self.width},高:{self.height}")

# 使用
# shape = Shape()  # 错误:不能实例化抽象类

circle = Circle(5)
circle.display()  # 圆形,半径:5
print(circle.get_info())  # 面积是:78.5

rectangle = Rectangle(4, 6)
rectangle.display()  # 矩形,宽:4,高:6
print(rectangle.get_info())  # 面积是:24

(三)具体类

具体类是可以实例化的类。

具体类示例

python 复制代码
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def get_info(self):
        return f"{self.name}, {self.age}岁"

# 可以实例化
student = Student("张三", 20)
print(student.get_info())  # 输出:张三, 20岁

(四)接口类

接口类定义了一组方法签名,子类必须实现这些方法。

接口类示例

python 复制代码
from abc import ABC, abstractmethod

# 接口类
class Drawable(ABC):
    @abstractmethod
    def draw(self):
        pass
    
    @abstractmethod
    def erase(self):
        pass

class Printable(ABC):
    @abstractmethod
    def print(self):
        pass

# 实现接口
class Document(Drawable, Printable):
    def __init__(self, content):
        self.content = content
    
    def draw(self):
        print(f"绘制文档:{self.content}")
    
    def erase(self):
        print(f"擦除文档:{self.content}")
    
    def print(self):
        print(f"打印文档:{self.content}")

# 使用
doc = Document("报告")
doc.draw()    # 绘制文档:报告
doc.print()   # 打印文档:报告

💡 四、实例概述

(一)实例的定义

实例是类的具体化,是根据类创建的具体对象。

实例概念
#mermaid-svg-h0O07gHzhIOTGIFL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-h0O07gHzhIOTGIFL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-h0O07gHzhIOTGIFL .error-icon{fill:#552222;}#mermaid-svg-h0O07gHzhIOTGIFL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-h0O07gHzhIOTGIFL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-h0O07gHzhIOTGIFL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-h0O07gHzhIOTGIFL .marker.cross{stroke:#333333;}#mermaid-svg-h0O07gHzhIOTGIFL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-h0O07gHzhIOTGIFL p{margin:0;}#mermaid-svg-h0O07gHzhIOTGIFL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-h0O07gHzhIOTGIFL .cluster-label text{fill:#333;}#mermaid-svg-h0O07gHzhIOTGIFL .cluster-label span{color:#333;}#mermaid-svg-h0O07gHzhIOTGIFL .cluster-label span p{background-color:transparent;}#mermaid-svg-h0O07gHzhIOTGIFL .label text,#mermaid-svg-h0O07gHzhIOTGIFL span{fill:#333;color:#333;}#mermaid-svg-h0O07gHzhIOTGIFL .node rect,#mermaid-svg-h0O07gHzhIOTGIFL .node circle,#mermaid-svg-h0O07gHzhIOTGIFL .node ellipse,#mermaid-svg-h0O07gHzhIOTGIFL .node polygon,#mermaid-svg-h0O07gHzhIOTGIFL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-h0O07gHzhIOTGIFL .rough-node .label text,#mermaid-svg-h0O07gHzhIOTGIFL .node .label text,#mermaid-svg-h0O07gHzhIOTGIFL .image-shape .label,#mermaid-svg-h0O07gHzhIOTGIFL .icon-shape .label{text-anchor:middle;}#mermaid-svg-h0O07gHzhIOTGIFL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-h0O07gHzhIOTGIFL .rough-node .label,#mermaid-svg-h0O07gHzhIOTGIFL .node .label,#mermaid-svg-h0O07gHzhIOTGIFL .image-shape .label,#mermaid-svg-h0O07gHzhIOTGIFL .icon-shape .label{text-align:center;}#mermaid-svg-h0O07gHzhIOTGIFL .node.clickable{cursor:pointer;}#mermaid-svg-h0O07gHzhIOTGIFL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-h0O07gHzhIOTGIFL .arrowheadPath{fill:#333333;}#mermaid-svg-h0O07gHzhIOTGIFL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-h0O07gHzhIOTGIFL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-h0O07gHzhIOTGIFL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h0O07gHzhIOTGIFL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-h0O07gHzhIOTGIFL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h0O07gHzhIOTGIFL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-h0O07gHzhIOTGIFL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-h0O07gHzhIOTGIFL .cluster text{fill:#333;}#mermaid-svg-h0O07gHzhIOTGIFL .cluster span{color:#333;}#mermaid-svg-h0O07gHzhIOTGIFL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-h0O07gHzhIOTGIFL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-h0O07gHzhIOTGIFL rect.text{fill:none;stroke-width:0;}#mermaid-svg-h0O07gHzhIOTGIFL .icon-shape,#mermaid-svg-h0O07gHzhIOTGIFL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h0O07gHzhIOTGIFL .icon-shape p,#mermaid-svg-h0O07gHzhIOTGIFL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-h0O07gHzhIOTGIFL .icon-shape .label rect,#mermaid-svg-h0O07gHzhIOTGIFL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h0O07gHzhIOTGIFL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-h0O07gHzhIOTGIFL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-h0O07gHzhIOTGIFL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 实例化

实例
具体对象
独立状态
唯一标识

(二)实例的特点

实例特点

特点 说明
具体性 类的具体化
独立性 独立的状态
唯一性 唯一的标识
动态性 可以改变状态

(三)实例化过程

实例化过程
#mermaid-svg-04X9HW8Gx3ccQ9ct{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-04X9HW8Gx3ccQ9ct .error-icon{fill:#552222;}#mermaid-svg-04X9HW8Gx3ccQ9ct .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-04X9HW8Gx3ccQ9ct .marker{fill:#333333;stroke:#333333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .marker.cross{stroke:#333333;}#mermaid-svg-04X9HW8Gx3ccQ9ct svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-04X9HW8Gx3ccQ9ct p{margin:0;}#mermaid-svg-04X9HW8Gx3ccQ9ct .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster-label text{fill:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster-label span{color:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster-label span p{background-color:transparent;}#mermaid-svg-04X9HW8Gx3ccQ9ct .label text,#mermaid-svg-04X9HW8Gx3ccQ9ct span{fill:#333;color:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .node rect,#mermaid-svg-04X9HW8Gx3ccQ9ct .node circle,#mermaid-svg-04X9HW8Gx3ccQ9ct .node ellipse,#mermaid-svg-04X9HW8Gx3ccQ9ct .node polygon,#mermaid-svg-04X9HW8Gx3ccQ9ct .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .rough-node .label text,#mermaid-svg-04X9HW8Gx3ccQ9ct .node .label text,#mermaid-svg-04X9HW8Gx3ccQ9ct .image-shape .label,#mermaid-svg-04X9HW8Gx3ccQ9ct .icon-shape .label{text-anchor:middle;}#mermaid-svg-04X9HW8Gx3ccQ9ct .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .rough-node .label,#mermaid-svg-04X9HW8Gx3ccQ9ct .node .label,#mermaid-svg-04X9HW8Gx3ccQ9ct .image-shape .label,#mermaid-svg-04X9HW8Gx3ccQ9ct .icon-shape .label{text-align:center;}#mermaid-svg-04X9HW8Gx3ccQ9ct .node.clickable{cursor:pointer;}#mermaid-svg-04X9HW8Gx3ccQ9ct .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .arrowheadPath{fill:#333333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-04X9HW8Gx3ccQ9ct .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-04X9HW8Gx3ccQ9ct .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-04X9HW8Gx3ccQ9ct .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster text{fill:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct .cluster span{color:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-04X9HW8Gx3ccQ9ct .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-04X9HW8Gx3ccQ9ct rect.text{fill:none;stroke-width:0;}#mermaid-svg-04X9HW8Gx3ccQ9ct .icon-shape,#mermaid-svg-04X9HW8Gx3ccQ9ct .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-04X9HW8Gx3ccQ9ct .icon-shape p,#mermaid-svg-04X9HW8Gx3ccQ9ct .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-04X9HW8Gx3ccQ9ct .icon-shape .label rect,#mermaid-svg-04X9HW8Gx3ccQ9ct .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-04X9HW8Gx3ccQ9ct .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-04X9HW8Gx3ccQ9ct .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-04X9HW8Gx3ccQ9ct :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 实例化
分配内存
调用构造函数
初始化属性
返回实例

实例化示例

python 复制代码
class Student:
    def __init__(self, name, age):
        print("1. 分配内存")
        print("2. 调用构造函数")
        self.name = name
        self.age = age
        print("3. 初始化属性")
        print("4. 返回实例")

# 实例化过程
print("开始实例化...")
student = Student("张三", 20)
print("实例化完成")

# 输出:
# 开始实例化...
# 1. 分配内存
# 2. 调用构造函数
# 3. 初始化属性
# 4. 返回实例
# 实例化完成

📊 五、类与实例的关系

(一)关系概述

关系概述
#mermaid-svg-aY7eFWpfOcYI8bSj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aY7eFWpfOcYI8bSj .error-icon{fill:#552222;}#mermaid-svg-aY7eFWpfOcYI8bSj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aY7eFWpfOcYI8bSj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aY7eFWpfOcYI8bSj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aY7eFWpfOcYI8bSj .marker.cross{stroke:#333333;}#mermaid-svg-aY7eFWpfOcYI8bSj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aY7eFWpfOcYI8bSj p{margin:0;}#mermaid-svg-aY7eFWpfOcYI8bSj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster-label text{fill:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster-label span{color:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster-label span p{background-color:transparent;}#mermaid-svg-aY7eFWpfOcYI8bSj .label text,#mermaid-svg-aY7eFWpfOcYI8bSj span{fill:#333;color:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj .node rect,#mermaid-svg-aY7eFWpfOcYI8bSj .node circle,#mermaid-svg-aY7eFWpfOcYI8bSj .node ellipse,#mermaid-svg-aY7eFWpfOcYI8bSj .node polygon,#mermaid-svg-aY7eFWpfOcYI8bSj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aY7eFWpfOcYI8bSj .rough-node .label text,#mermaid-svg-aY7eFWpfOcYI8bSj .node .label text,#mermaid-svg-aY7eFWpfOcYI8bSj .image-shape .label,#mermaid-svg-aY7eFWpfOcYI8bSj .icon-shape .label{text-anchor:middle;}#mermaid-svg-aY7eFWpfOcYI8bSj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aY7eFWpfOcYI8bSj .rough-node .label,#mermaid-svg-aY7eFWpfOcYI8bSj .node .label,#mermaid-svg-aY7eFWpfOcYI8bSj .image-shape .label,#mermaid-svg-aY7eFWpfOcYI8bSj .icon-shape .label{text-align:center;}#mermaid-svg-aY7eFWpfOcYI8bSj .node.clickable{cursor:pointer;}#mermaid-svg-aY7eFWpfOcYI8bSj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aY7eFWpfOcYI8bSj .arrowheadPath{fill:#333333;}#mermaid-svg-aY7eFWpfOcYI8bSj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aY7eFWpfOcYI8bSj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aY7eFWpfOcYI8bSj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aY7eFWpfOcYI8bSj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aY7eFWpfOcYI8bSj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aY7eFWpfOcYI8bSj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster text{fill:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj .cluster span{color:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aY7eFWpfOcYI8bSj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aY7eFWpfOcYI8bSj rect.text{fill:none;stroke-width:0;}#mermaid-svg-aY7eFWpfOcYI8bSj .icon-shape,#mermaid-svg-aY7eFWpfOcYI8bSj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aY7eFWpfOcYI8bSj .icon-shape p,#mermaid-svg-aY7eFWpfOcYI8bSj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aY7eFWpfOcYI8bSj .icon-shape .label rect,#mermaid-svg-aY7eFWpfOcYI8bSj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aY7eFWpfOcYI8bSj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aY7eFWpfOcYI8bSj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aY7eFWpfOcYI8bSj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 类与实例
模板与产品
抽象与具体
一对多关系
类是模板
实例是产品
类是抽象
实例是具体
一个类多个实例

(二)关系详解

关系详解

关系 说明
模板关系 类是模板,实例是产品
抽象关系 类是抽象,实例是具体
一对多 一个类可以创建多个实例
独立关系 实例之间相互独立

(三)关系示例

关系示例

python 复制代码
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def get_info(self):
        return f"{self.name}, {self.age}岁"

# 一个类,多个实例
student1 = Student("张三", 20)
student2 = Student("李四", 21)
student3 = Student("王五", 22)

# 实例之间相互独立
print(student1.get_info())  # 输出:张三, 20岁
print(student2.get_info())  # 输出:李四, 21岁
print(student3.get_info())  # 输出:王五, 22岁

# 修改一个实例不影响其他实例
student1.age = 25
print(student1.get_info())  # 输出:张三, 25岁
print(student2.get_info())  # 输出:李四, 21岁(未改变)

📋 六、类的设计原则

(一)单一职责原则

单一职责原则:一个类应该只有一个职责。

示例

python 复制代码
# 违反单一职责原则
class User:
    def __init__(self, name, email):
        self.name = name
        self.email = email
    
    def save_to_db(self):
        # 保存数据库
        pass
    
    def send_email(self):
        # 发送邮件
        pass

# 遵循单一职责原则
class User:
    def __init__(self, name, email):
        self.name = name
        self.email = email

class UserRepository:
    def save(self, user):
        # 保存数据库
        pass

class EmailService:
    def send(self, user):
        # 发送邮件
        pass

(二)开闭原则

开闭原则:对扩展开放,对修改关闭。

示例

python 复制代码
# 违反开闭原则
class Discount:
    def calculate(self, price, type):
        if type == "VIP":
            return price * 0.8
        elif type == "NORMAL":
            return price * 0.9
        return price

# 遵循开闭原则
class Discount:
    def calculate(self, price):
        return price

class VIPDiscount(Discount):
    def calculate(self, price):
        return price * 0.8

class NormalDiscount(Discount):
    def calculate(self, price):
        return price * 0.9

(三)里氏替换原则

里氏替换原则:子类应该能够替换父类。

示例

python 复制代码
# 遵循里氏替换原则
class Shape:
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height

class Square(Shape):
    def __init__(self, side):
        self.side = side
    
    def area(self):
        return self.side ** 2

# 子类可以替换父类
def print_area(shape):
    print(f"面积:{shape.area()}")

print_area(Rectangle(4, 6))  # 面积:24
print_area(Square(5))        # 面积:25

(四)接口隔离原则

接口隔离原则:使用多个专门的接口。

示例

python 复制代码
# 违反接口隔离原则
class Worker:
    def work(self):
        pass
    
    def eat(self):
        pass

# 遵循接口隔离原则
class Workable:
    def work(self):
        pass

class Eatable:
    def eat(self):
        pass

class HumanWorker(Workable, Eatable):
    def work(self):
        pass
    
    def eat(self):
        pass

class RobotWorker(Workable):
    def work(self):
        pass

(五)依赖倒置原则

依赖倒置原则:依赖抽象而非具体。

示例

python 复制代码
# 违反依赖倒置原则
class BusinessLogic:
    def __init__(self):
        self.database = MySQLDatabase()
    
    def process(self):
        self.database.query()

# 遵循依赖倒置原则
class Database:
    def query(self):
        pass

class MySQLDatabase(Database):
    def query(self):
        pass

class BusinessLogic:
    def __init__(self, database: Database):
        self.database = database
    
    def process(self):
        self.database.query()

📝 七、类和实例的应用

(一)应用背景

项目:学生成绩管理系统

类设计

  • Student类:学生类
  • Course类:课程类
  • Grade类:成绩类

(二)类设计

Student类

python 复制代码
class Student:
    # 类属性
    school = "清华大学"
    count = 0
    
    def __init__(self, student_id, name, age):
        # 实例属性
        self.student_id = student_id
        self.name = name
        self.age = age
        self.courses = []
        self.grades = {}
        Student.count += 1
    
    # 实例方法
    def enroll(self, course):
        """选课"""
        if course not in self.courses:
            self.courses.append(course)
            print(f"{self.name}选了{course.name}")
    
    def set_grade(self, course, grade):
        """设置成绩"""
        self.grades[course.name] = grade
    
    def get_average(self):
        """获取平均分"""
        if not self.grades:
            return 0
        return sum(self.grades.values()) / len(self.grades)
    
    def get_info(self):
        """获取信息"""
        return f"{self.name}, {self.age}岁, 平均分:{self.get_average():.2f}"
    
    # 类方法
    @classmethod
    def get_count(cls):
        """获取学生总数"""
        return cls.count
    
    # 静态方法
    @staticmethod
    def is_valid_id(student_id):
        """验证学号"""
        return len(student_id) == 8

Course类

python 复制代码
class Course:
    def __init__(self, course_id, name, credit):
        self.course_id = course_id
        self.name = name
        self.credit = credit
        self.students = []
    
    def add_student(self, student):
        """添加学生"""
        if student not in self.students:
            self.students.append(student)
    
    def get_student_count(self):
        """获取学生数"""
        return len(self.students)
    
    def get_info(self):
        """获取信息"""
        return f"{self.name}, 学分:{self.credit}, 学生数:{self.get_student_count()}"

Grade类

python 复制代码
class Grade:
    def __init__(self, student, course, score):
        self.student = student
        self.course = course
        self.score = score
    
    def is_passed(self):
        """是否及格"""
        return self.score >= 60
    
    def get_level(self):
        """获取等级"""
        if self.score >= 90:
            return "优秀"
        elif self.score >= 80:
            return "良好"
        elif self.score >= 70:
            return "中等"
        elif self.score >= 60:
            return "及格"
        else:
            return "不及格"
    
    def get_info(self):
        """获取信息"""
        return f"{self.student.name}的{self.course.name}成绩:{self.score}分({self.get_level()})"

(三)实例使用

实例使用示例

python 复制代码
# 创建课程实例
course1 = Course("C001", "数学", 4)
course2 = Course("C002", "英语", 3)
course3 = Course("C003", "计算机", 4)

# 创建学生实例
student1 = Student("20240001", "张三", 20)
student2 = Student("20240002", "李四", 21)

# 学生选课
student1.enroll(course1)
student1.enroll(course2)
student1.enroll(course3)

student2.enroll(course1)
student2.enroll(course3)

# 创建成绩实例
grade1 = Grade(student1, course1, 85)
grade2 = Grade(student1, course2, 92)
grade3 = Grade(student1, course3, 78)

grade4 = Grade(student2, course1, 90)
grade5 = Grade(student2, course3, 88)

# 设置成绩
student1.set_grade(course1, 85)
student1.set_grade(course2, 92)
student1.set_grade(course3, 78)

student2.set_grade(course1, 90)
student2.set_grade(course3, 88)

# 查看信息
print(student1.get_info())  # 张三, 20岁, 平均分:85.00
print(student2.get_info())  # 李四, 21岁, 平均分:89.00

print(course1.get_info())  # 数学, 学分:4, 学生数:2
print(course2.get_info())  # 英语, 学分:3, 学生数:1
print(course3.get_info())  # 计算机, 学分:4, 学生数:2

print(grade1.get_info())  # 张三的数学成绩:85分(良好)
print(grade2.get_info())  # 张三的英语成绩:92分(优秀)

print(f"学生总数:{Student.get_count()}")  # 学生总数:2
print(f"学号验证:{Student.is_valid_id('20240001')}")  # 学号验证:True

📝 总结

类和实例是面向对象技术的核心概念。

🎯 类的定义:类是对象的模板,定义了对象的属性和方法,是一组具有相同属性和行为的对象的抽象。

📦 类的组成

  • 属性:类的数据成员,包括类属性和实例属性
  • 方法:类的操作行为,包括实例方法、类方法和静态方法
  • 构造函数:创建对象时自动调用
  • 析构函数:销毁对象时自动调用

🌐 类的类型

  • 抽象类:不能实例化,定义抽象方法
  • 具体类:可以实例化
  • 接口类:定义接口规范

💡 实例定义:实例是类的具体化,是根据类创建的具体对象。

📊 类与实例的关系

  • 模板关系:类是模板,实例是产品
  • 抽象关系:类是抽象,实例是具体
  • 一对多:一个类可以创建多个实例
  • 独立关系:实例之间相互独立

📋 类的设计原则

  • 单一职责原则:一个类只有一个职责
  • 开闭原则:对扩展开放,对修改关闭
  • 里氏替换原则:子类可以替换父类
  • 接口隔离原则:使用多个专门接口
  • 依赖倒置原则:依赖抽象而非具体

核心启示:类和实例是面向对象技术的核心概念,类是对象的模板,实例是类的具体化。理解类和实例的概念和关系,是掌握面向对象技术的关键。在实际工作中,我们需要注意:第一,深入理解类的组成要素(属性、方法、构造函数、析构函数);第二,掌握类的不同类型(抽象类、具体类、接口类);第三,理解类与实例的关系(模板与产品、抽象与具体、一对多);第四,遵循类的设计原则(SOLID原则);第五,合理设计类,确保类的单一职责和高内聚低耦合。类和实例不仅是代码的基本单元,更是我们理解和建模现实世界的工具。通过合理的类设计,我们可以构建出结构清晰、易于维护的软件系统。记住:好的类设计是面向对象成功的基础。


相关推荐
海天鹰3 小时前
扩容U盘恢复
软件工程
梁辰兴2 天前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
梁辰兴2 天前
软件工程:详细设计规格说明
软件工程·梁辰兴·文档定位·内容体系·详细设计规格说明·核心要素·评审机制
XDevelop AI智能应用软件开发2 天前
AI演进下的“第五次软件危机”与软件工程重塑
人工智能·软件工程·ai编程·软件危机
梁辰兴2 天前
软件工程:详细设计规格说明评审
软件工程·梁辰兴·评审内容·评审方法·评审意义·评审流程·详细设计规格说明评审
嘟哩DuliDuli2 天前
AI 账单变高的技术原因:重复上下文和用量归属
android·人工智能·安全·ai·软件工程
XR1234567883 天前
医院组网全生命周期成本选型解析
软件工程
梁辰兴3 天前
软件工程:数据库设计
数据库·软件工程·数据库设计·逻辑设计·概念设计·梁辰兴·物理设计
lidtao3 天前
青少年信息学奥赛C++四阶段学习路线(L1-L4完整体系)
c++·学习·软件工程·教培资源分享