【Python】面向对象(专版提升2)
面向对象
- 1. 概述
- 1.1面向过程
- 1.2 面向对象
- 2. 类和对象
- 2.1 语法
- 2.1.1 定义类
- 2.1.2 实例化对象
- 2.2 实例成员
- 2.2.1 实例变量
- 2.2.2 实例方法
- 2.2.3 跨类调用
- 3. 三大特征
- 3.1 封装
- 3.1.1 数据角度
- 3.1.2 行为角度
- 3.1.3 案例:信息管理系统
- 3.1.3.1 需求
- 3.1.3.2 分析
- 3.1.3.3 设计
- 3.2 继承
- 3.2.1 继承方法
- 3.2.2 内置函数
- 3.2.4 定义
- 3.3 多态
- 3.3.1 定义
- 3.3.2 重写
- 3.3.3 重写内置函数
1. 概述
1.1面向过程
(1) 定义:分析出解决问题的步骤,然后逐步实现。
(2) 案例:
dict_bjlz = {
"name": "八角笼中", "type": "剧情", "index": 690761
}
dict_fs = {
"name": "封神第一部", "type": "奇幻", "index": 532622
}
print("%s电影类型是%s,指数%s." %
(dict_bjlz["name"],dict_bjlz["type"],dict_bjlz["index"]))
print("%s电影类型是%s,指数%s." %
(dict_fs["name"],dict_fs["type"],dict_fs["index"]))
(3) 优点:简单直观,适合顺序按步骤执行的任务
(4) 缺点:所有字典都要重复定义键,数据与算法分离不易扩展
1.2 面向对象
(1) 定义:可以使用类将变量与函数组合成新的数据类型
(2)案例:
class Movie:def __init__(self, name, type, index):self.name = nameself.type = typeself.index = indexdef display(self):print("%s电影的类型是%s,指数是%s." % (self.name, self.type, self.index))bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
bjlz.display()
fs.display()
(3) 优点:将每个字典相同的键统一定义在类中,将数据与对应的操作组合在一起扩展性强
(4) 缺点:学习曲线陡峭
2. 类和对象
2.1 语法
2.1.1 定义类

(1) 代码
class 类名:"""文档说明"""def __init__(self,参数):self.实例变量 = 参数def 实例方法(self,参数):pass
(2) 说明
– 类名所有单词首字母大写.
– init 也叫构造函数,创建对象时被调用,也可以省略。
– self 变量绑定的是被创建的对象,名称可以随意。
2.1.2 实例化对象

(1) 代码
对象名 = 类名(数据)
(2) 说明
– 对象名存储的是实例化后的对象地址
– 类名后面的参数按照构造函数的形参传递
2.2 实例成员
2.2.1 实例变量
(1) 语法
a. 定义:对象.变量名
b. 调用:对象.变量名
(2) 说明
a. 首次通过对象赋值为创建,再次赋值为修改.
class Movie:passmovie = Movie()
movie.name = "八角笼中"
movie.name = "封神第一部"
b. 通常在构造函数(_init)中创建
class Movie:def __init__(self, name, type, index):self.name = namemovie = Movie("八角笼中")
print(movie.name)
(3) 每个对象存储一份,通过对象地址访问
(4) 作用:描述某个对象的数据。
(5) dict:对象的属性,用于存储自身实例变量的字典。
2.2.2 实例方法
(1) 定义
def 方法名称(self, 参数):方法体
(2) 调用:
对象.方法名称(参数)
# 不建议通过类名访问实例方法
(3) 说明
– 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为self。
– 无论创建多少对象,方法只有一份,并且被所有对象共享。
(4) 作用:表示对象行为。
2.2.3 跨类调用
# 写法1:直接创建对象
# 语义:老张每次创建一辆新车去
class Person:def __init__(self, name=""):self.name = namedef go_to(self,position):print("去",position)car = Car()car.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
lz.go_to("东北")# 写法2:在构造函数中创建对象
# 语义:老张开自己的车去
class Person:def __init__(self, name=""):self.name = nameself.car = Car()def go_to(self,position):print("去",position)self.car.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
lz.go_to("东北")# 方式3:通过参数传递
# 语义:老张用交通工具去
class Person:def __init__(self, name=""):self.name = namedef go_to(self,vehicle,position):print("去",position)vehicle.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
benz = Car()
lz.go_to(benz,"东北")
3. 三大特征
3.1 封装
3.1.1 数据角度
(1) 定义:将一些基本数据类型复合成一个自定义类型。
(2) 优势:
– 将数据与对数据的操作相关联。
– 代码可读性更高(类是对象的模板)。
3.1.2 行为角度
(1) 定义:
向类外提供必要的功能,隐藏实现的细节。
(2) 优势:
简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。
(3) 私有成员:
– 作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
– 做法:命名使用双下划线开头。
– 本质:障眼法,实际也可以访问。
私有成员的名称被修改为:类名_成员名,可以通过__dict__属性查看。
– 演示
class MyClass:def __init__(self, data):self.__data = datadef __func01(self):print("func01执行了")m01 = MyClass(10)
# print(m01.__data) # 无法访问
print(m01._MyClass__data)
print(m01.__dict__) # {'_MyClass__data': 10}
# m01.__func01() # 无法访问
m01._MyClass__func01()
3.1.3 案例:信息管理系统
3.1.3.1 需求
实现对用户信息的增加、删除、修改和查询。
3.1.3.2 分析
界面可能使用控制台,也可能使用Web等等。
(1) 识别对象:界面视图类 逻辑控制类 数据模型类
(2) 分配职责:
– 界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。
– 逻辑控制类:负责存储用户信息,处理业务逻辑。比如添加、删除等
– 数据模型类:定义需要处理的数据类型。比如用户信息。
(3) 建立交互:
界面视图对象 <----> 数据模型对象 <----> 逻辑控制对象
3.1.3.3 设计
(1) 数据模型类:UserModel
– 数据:编号 id,姓名 name,年龄 login_id,密码 pwd
(2) 逻辑控制类:UserController
– 数据:用户列表 list_user
– 行为:添加用户 add_user,删除用户remove_student,修改用户update_student
(3) 界面视图类:UserView
– 数据:逻辑控制对象controller
– 行为:显示菜单__display_menu,选择菜单项__select_menu,入口逻辑main,
输入学生__input_users,输出学生__display_user,删除学生__delete_user,
修改学生信息__modify_user
3.2 继承
3.2.1 继承方法
(1) 语法:
class 父类:def 父类方法(self):方法体class 子类(父类):def 子类方法(self):方法体儿子 = 子类()
儿子.子类方法()
儿子.父类方法()
(2) 说明:
子类直接拥有父类的方法.
(3) 演示:
class Person:def say(self):print("说话")class Teacher(Person):def teach(self):self.say()print("教学")class Student(Person):def study(self):self.say()print("学习")qtx = Teacher()
qtx.say()
qtx.teach()xm = Student()
xm.say()
xm.study()
3.2.2 内置函数
(1) isinstance(对象, 类型)
对象是否为一种类型
(2) type(类型) == 类型
对象的类型是否是一种类型
(3) 演示
# 对象 是一种 类型: isinstance(对象,类型)
# 老师对象 是一种 老师类型
print(isinstance(qtx, Teacher)) # True
# 老师对象 是一种 人类型
print(isinstance(qtx, Person)) # True
# 老师对象 是一种 学生类型
print(isinstance(qtx, Student)) # False
# 人对象 是一种 学生类型
print(isinstance(p, Student)) # False
# 是的关系
# 老师对象的类型 是 老师类型
print(type(qtx) == Teacher) # True
# 老师对象的类型 是 人类型
print(type(qtx) == Person) # False
3.2.3 继承数据
(1) 语法
class 子类(父类):def __init__(self,父类参数,子类参数):super().__init__(参数) # 调用父类构造函数self.实例变量 = 参数
(2) 说明
子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类实例变量被正常创建。
(3) 演示
class Person:def __init__(self, name="", age=0):self.name = nameself.age = age# 子类有构造函数,不会使用继承而来的父类构造函数[子覆盖了父方法,好像它不存在]
class Student(Person):# 子类构造函数:父类构造函数参数,子类构造函数参数def __init__(self, name, age, score):# 调用父类构造函数super().__init__(name, age)self.score = scorets = Person("唐僧",22)
print(ts.name)
kw = Student("悟空", 23, 100)
print(wk.name)
print(wk.score)
3.2.4 定义
(1) 概念: 重用现有类的功能,并在此基础上进行扩展。
(2) 说明:子类直接具有父类的成员(共性),还可以扩展新功能。
(3) 相关知识
– 父类(基类、超类)、子类(派生类)。
– 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。
– 单继承:父类只有一个(例如 Java,C#)。
– 多继承:父类有多个(例如C++,Python)。
– Object类:任何类都直接或间接继承自 object 类。
3.3 多态
3.3.1 定义
(1) 字面意思:对于一种行为有不同表现形态。
(2) 概念:对于父类的一个方法,在不同的子类上有不同体现。
(3) 说明:编码时调用父类方法,运行时传递子类对象执行子类方法。
3.3.2 重写
(1) 定义:在子类定义与父类相同的方法。
(2) 作用:改变父类行为,体现子类个性。
3.3.3 重写内置函数
(1) 定义:Python中,以双下划线开头、双下划线结尾的是系统定义的成员。我们可以在自定义类中进
行重写,从而改变其行为。
(2) str 函数:将对象转换为字符串(对人友好的)
– 演示
class Movie:
def __init__(self, name, type, index):
self.name = name
self.type = type
self.index = index
def __str__(self):
print("%s电影的类型是%s,指数是%s." % (self.name, self.type, self.index))
bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
print(bjlz)
print(fs)
(3) 算数运算符

(4) 复合运算符重载

(5) 比较运算重载

相关文章:
【Python】面向对象(专版提升2)
面向对象 1. 概述1.1面向过程1.2 面向对象 2. 类和对象2.1 语法2.1.1 定义类2.1.2 实例化对象 2.2 实例成员2.2.1 实例变量2.2.2 实例方法2.2.3 跨类调用 3. 三大特征3.1 封装3.1.1 数据角度3.1.2 行为角度3.1.3 案例:信息管理系统3.1.3.1 需求3.1.3.2 分析3.1.3.3 设计 3.2 继…...
Vscode设置滚轮进行字体大小的调节
Vscode设置滚轮进行字体大小的调节 正常的话按 ctrl 或者 ctrl - 进行字体的大小调节 1.打开Vscode,找打设置的图标,在点击设置,或者直接使用快捷键,【ctrl ,】 2. 在搜索框搜索Font Ligatures 3.双击进入settings.json ,找到如…...
【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件
【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件 往期回顾 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 一、最终…...
Spring Validation解决后端表单校验
NotNull:从前台传递过来的参数不能为null,如果为空,会在控制台日志中把message打印出来 Range:范围,最大多少,最小多少 Patten,标注的字段值必须符合定义的正则表达式(按照业务规则࿰…...
Harmony鸿蒙南向驱动开发-UART接口使用
功能简介 UART指异步收发传输器(Universal Asynchronous Receiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 两个UART设备的连接示意图如下,UART与其他模块一…...
【示例】MySQL-事务控制示例:账户转账-savepoint关键字
前言 本文讲述MySQL中的事务,以账户转账为例,体会事务的概念,并讲解事务相关的一个关键字用法:savepoint 示例 数据准备 drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,n…...
STM32使用标准版RT-Thread,移植bsp中的板文件后,想使用I/O设备模型,使用串口3或者串口4收发时,发现串口3或者串口4没反应
STM32移植RT-Thread出现的问题及解决办法 问题原因解决方法 问题 使用标准版RT-Thread,移植bsp中的板文件后,想使用I/O设备模型,使用串口3或者串口4收发时,发现串口3或者串口4没反应。出现问题:程序一直跑在 while (__HAL_UART_…...
MVCC(解决MySql中的并发事务的隔离性)
MVCC 如何保证事务的隔离性? 1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。 2.MVCC:多版本并发控制。 MVCC: 1.隐藏字段 1.DB_TRX_ID:最近修改事务的id。默认值从0开…...
第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证
文章目录 第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证在处理请求之前在 CSP 中进行身份验证。 第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证 在处理请求之前在 CSP 中进行身份验证。 这是…...
家庭网络防御系统搭建-siem之security onion 安装配置过程详解
本文介绍一下security onion的安装流程,将使用该工具集中管理终端EDR和网络NDR sensor产生的日志。 充当SIEM的平台有很多,比如可以直接使用原生的elastic以及splunk等,security onion的优势在于该平台能够方便的集成网络侧(比如…...
【MATLAB源码-第23期】基于matlab的短时傅里叶STFT信号变换仿真,得到信号的时频曲线图。
1、算法描述 短时傅里叶变换(Short-Time Fourier Transform,STFT)是傅里叶变换的一种扩展,用于分析信号在时域和频域上的变化。描述如下: 1. **时域与频域分析**: - 信号通常以时域的形式表示…...
链表中倒数最后k个结点【c语言】
#include <stdio.h> #include <stdlib.h>typedef struct Node {int data;struct Node* next; } Node, *LinkedList;// 创建一个新节点 Node* createNode(int data) {Node* newNode (Node*)malloc(sizeof(Node));if (newNode NULL) {printf("Error! Unable t…...
在一台恢复测试机器上验证oracle备份有效性
一 目的 定期将生产环境oracle数据库恢复到一台测试环境数据库服务器上,以验证备份是否有效,是否能正常恢复。 二 环境 这里以恢复orcl1库为例,计划在orcl这个实例上进行恢复测试。 三 实验步骤 3.1 在目标端创建和源端一样的备份目录 ①…...
Harmony鸿蒙南向驱动开发-MIPI CSI
CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS(High Speed&…...
最优算法100例之43-包含min函数的栈
专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂…...
什么是One-Class SVM
1. 简介 单类支持向量机,简称One-Class SVM(One-Class Support Vector Machine),是一种用于异常检测的监督学习算法。其主要目标是找出数据集中的异常或罕见样本,而不需要大量的正常样本用于训练。这使其在处理高维数据和非常稀疏的异常检测问…...
【Ubuntu】远程连接乌班图的方式-命令行界面、图形界面
系统环境:ubuntu-22.04.2-amd64.iso 连接工具:MobaXterm、windows自带远程桌面mstsc.exe 重置root密码:Ubuntu默认root密码是随机的,需要使用命令sudo passwd 进行重置。 一、命令行界面-SSH连接 1.1 SSH服务安装 …...
Ubuntu无网络标识的解决方法
1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim,两个随意一个,这里用的gedit,没有就先弄gedit,有的话直接下一步 apt-get install gedit 或者vim apt-get ins…...
基于springboot实现课程答疑管理系统项目【项目源码+论文说明】
基于springboot实现课程答疑管理系统演示 摘要 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求,创建了…...
【JVM】面试题汇总
JVM1. 什么是JVM?2. 了解过字节码文件的组成吗?3. 什么是运行时数据区4. 哪些区域会出现内存溢出5. JVM在JDK6-8之间在内存区域上有什么不同 6. 类的生命周期 7. 什么是类加载器?类加载器有哪几种 8. 什么是双亲委派机制?有什么好…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...
