pyhton基础【18】面向对象基础一

目录

一.面向对象

二.面向对象概述

三.类与对象


一.面向对象

Python中的面向对象编程OOP是一种编程范式,它使用对象来设计软件。对象是具有属性(称为属性)和可以执行的操作(称为方法)的数据结构。

基础概念

类:class

类是创建对象的蓝图或模板。它为对象提供了初始状态(属性)和行为(方法)

对象:Object

对象是类的实例。它由类实例化而成,具体实现了类中定义的行为。

属性:Attribute

属性是保存在对象中的数据,代表了对象的状态。

方法:Method

方法是定义在类中的函数,能够对对象进行操作或计算。

继承:Inheritance

继承是一种机制,它允许一个类继承另一个类的属性和方法,从而促进代码的复用。

封装:Encapsulation

封装是将对象的实现细节隐藏起来,只暴露有限的接口供外部访问。

多态:Polymorphism

多态是对象根据引用类型或继承的实体展现出不同的形态。

使用场景

1. 建模真实世界的问题: 

  • 当问题可以以物体、实体或者具有明确层次结构的事物表示时,OOP特别有用,比如管理人员、汽车、账户等。

2. 软件设计和架构: 

  • 大型软件项目通常划分为多个互相协作的模块。OOP使得通过定义清晰的类和对象来组织这些模块成为可能。

3. 游戏开发:

  • 游戏中的角色、道具等都可作为对象来处理,每个对象有其属性和行为,易于管理和拓展。

4. 用户界面设计:

  • 用户界面组件,如按钮、窗口和菜单项等,很自然地映射为对象,每个对象有其方法进行响应和处理用户的操作。

5. Web应用开发: 

  • 如Django和Flask,使用OOP实现模型(Model)、视图(View)、控制器(Controller)(MVC)或模型(Model)、视图(View)、模板(Template)(MVT)模式。

6. 代码复用和组织: 

  • 通过创建一个基础类,其他相关的子类可以继承并重用代码,减少冗余,并有助于维护。

面向对象编程提供了一种清晰的方式来组织复杂的代码结构,使得大型项目的维护和协作变得更为容易。其主要优势是提高了代码的可读性、可扩展性和可维护性。在设计初期,使用OOP进行系统设计能够帮助开发者更直观地理解问题,并且更好地进行模块和功能的划分。

二.面向对象概述

需求

编写一个程序,完成一名学生的信息输出

  • 定义学生的姓名与年龄
  • 打印信息

使用面向过程的方式实现

# 遍历打印所有姓名-年龄
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年龄:", ages_temp)# 定义一个变量存储姓名
name = "小明"
# 定义一个变量存储年龄
age = 20# 遍历姓名-年龄
print_info(name, age)

分析

从上述通过面向过程方式实现的代码中,我们可以发现代码行数不是很多,整个程序比较简单。

但是上面的代码虽然看上去简单,实际上如果我们想要进行升级功能则不见得容易,例如:我们需要在上述的代码基础上修改并实现三名同学的信息存储,那么应该怎么办呢?看看下面的方式是否可行?有什么不好的地方?

# 遍历打印所有姓名-年龄
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年龄:", ages_temp)# 定义第1个人的信息,然后输出
name = "小明"
age = 20
print_info(name, age)# 定义第2个人的信息,然后输出
name = "双双"
age = 22
print_info(name, age)# 定义第3个人的信息,然后输出
name = "安娜"
age = 23
print_info(name, age)

下面对代码进行优化:

# 遍历打印所有姓名-年龄
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年龄:", ages_temp)# 定义第1个人的信息,然后输出
names = ["小明", "双双", "安娜"]
ages = [20, 22, 23]
print_info(names[0], ages[0])
print_info(names[1], ages[1])
print_info(names[2], ages[2])

上面我们使用了列表进行了升级,避免了定义多个变量的问题。但是你是否有这样的感觉,即便是升级了总感觉还是不够好。如果有这种感觉就对了,因为上面的这种方式就是面向过程开发,这种开发模式就是一步步的对需要的数据以及方法进行操作。因此出现代码乱的情况,在所难免。

使用面向对象的方式实现

下面代码是使用面向对象开发模式,实现一名同学的信息输出:

class Person:def __init__(self, name, age):self.name = nameself.age = age# 遍历打印所有姓名-年龄def print_info(self):print("姓名:", self.name, " 年龄:", self.age)# 创建一个对象
p = Person("小明", 20)
p.print_info()按照这个思路,如果想要创建三个人呢?见如下代码:按照这个思路,如果想要创建三个人呢?见如下代码:
# 创建另外2个对象
p2 = Person("双双", 22)
p2.print_info()
p3 = Person("安娜", 23)
p3.print_info()

上述代码第十二行代码中定义了一个Person类的变量p让这它指向一个对象,在这个对象中有name、age以及打印信息的功能代码(本节仅仅是引出面向对象的好处,详细的对象等知识接下来详细讲解),这样一来想要表示一个人就创建一个Person类的对象即可,如果不看第1~10行,只看第12~13行的话,就会有一种感觉:原来模拟创建一个人只需要这么简单的代码

面向过程与面向对象的对比分析

通过上述两种代码的实现方式(面向过程、面向对象)我们能够的粗以下几个结论:

  • 面向过程:根据业务逻辑从上到下写代码
  • 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
  • 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑。

简单总结

面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。

这种方法把软件系统中相近相似的操作逻辑、操作应用数据和状态用类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

简单来说:面向对象能实现的功能,面向过程也能实现,往往程序的代码量都比较大,如果用面向过程的方式实现则代码冗余且不已升级,使用面向对象将数据与功能进行封装在中大程序开发中首先考虑使用。

三.类与对象

对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念:类

  • 类,就相当于制造飞机时的图纸,想象成模具
  • 对象,就相当于创建的飞机,想象成通过模具制造出的物品

相关概念

人以类聚,物以群分。具有相似内部状态和运动规律的实体的集合(或统称为抽象)。 具有相同属性和行为事物的统称

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,并使用这个具体的存在,一个类可以找到多个对象。

示例:

class Person:def __init__(self, name, age):self.name = nameself.age = age# 遍历打印所有姓名-年龄def print_info(self):print("姓名:", self.name, " 年龄:", self.age)

对象

某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的

示例:

Person("安娜", 20)  # 执行完之后返回值就是对象的引用

类与对象的关系

先有类,通过类创建对象

用一个生活中的例子来说明:某公司在签署某个合同时往往需要在文件中盖章,在纸质合同上的印章图案就是对象,那么印章就是类。

一句话说明:类是模板,对象是类这个模板生产出来的具体的产品。

类的构成

类class由三个部分组成:

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法:允许对进行操作的方法 (行为)

示例:

如何创建人物对象

  • 事物名称(类名):人(Person)
  • 属性:身高(height)、年龄(age)
  • 方法(行为/功能):跑(run)、打架(fight)

如何创建狗类对象

  • 类名:狗(Dog)
  • 属性:品种 、毛色、性别、名字、 腿儿的数量
  • 方法(行为/功能):叫 、跑、咬人、吃、摇尾巴

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912316.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Requests源码分析:面试考察角度自验(初级)

简单描述执行流程 Q:能简单描述一下发送一个requests.get(url)请求时,在requests库内部的主要执行流程吗?(从调用get方法到收到响应) 入口委托: get() 方法内部调用 requests.request(GET, url)。Session 接管: request() 方法会获取或隐式创建一个 Session 对象,并调用…

鸿蒙5:条件-循环-列表渲染

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

浅谈AI大模型-MCP

MCP简介 MCP(Model Context Protocol,模型上下文协议 ),24年11月初的时候Anthropic发了一篇技术博客,推出了他们的模型上下文协议MCP,介绍了一种规范:应用如何为LLM提供上下文。官网称MCP为AI应…

MySQL数据库基础概述

前言: MySQL作为全球应用最广泛的开源关系型数据库管理系统(RDBMS)​,凭借其高性能、高可靠性与零成本特性,已成为Web应用、企业系统的核心数据引擎。它遵循SQL标准,通过表结构实现数据的结构化存储&#x…

桌面小屏幕实战课程:DesktopScreen 16 HTTP

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源码下载方式参考: 源码下载方式 心知天气 注册账号,申请产品,获取密钥 产品 天气数据 H…

vs2019 + QT下 vs2019创建的项目打开ui文件失败

问题: 在vs2019 QT模式下。使用2019创建工程后。点击ui文件打开时。出现奔溃,如下图 解决方式: ui文件->右键->打开方式->添加->程序->点击三个点->qcreator(qt安装目录) ->设置为默认值->确定 点击设置为默认值,点…

WPS之PPT镂空效果实现

1、准备一张图片,剪切存入剪贴板 2、把图片设为背景 右键 》 设置背景格式 》 图片或纹理填充 》 图片填充选择剪贴板 3、插入一个矩形覆盖全图,设置无线条渐变填充从左到右 4、插入圆角矩形 5、单击小黄点调整弧度 6、选择无线条幻灯片背景填充 7、插…

服务注册中心的本质抉择:从业务本质看AP与CP的终极之选

本文从服务注册中心的本质职责出发,通过分析其核心功能、业务场景和技术约束,深入探讨服务注册中心在架构设计上应该优先保证AP还是CP特性。文章首先剖析服务注册中心的根本使命,然后从分布式系统原理、生产实践案例和性能表现三个维度进行对…

mybatis-plus从入门到入土(一):快速开始

​ 朋友们, 大家好, 从今天开始我想开一个系列博客。名字起的比较随意就叫Mybatis-Plus从入门到入土, 这系列博客的定位是从基础使用开始, 然后逐步深入全面的了解Mybatis-Plus框架, 写这个博客的主要原因是工作中经常用到Mybatis-Plus框架, 因而对这个框架相对比较了解一些, 顺…

如何快速将iPhone中的文本保存到电脑上

您的 iPhone 上是否有很多重要的短信,并且您想将短信备份到计算机上?我们都知道传输消息与传输照片不同,但幸运的是,您可以使用相关的工具和方法来实现。我们介绍了 4 种方法来解释如何将 iPhone 中的文本保存到计算机。所有的办法…

【OpenGL学习】(八)图形变换

OpenGL图形变换介绍:https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations 【OpenGL学习】(八)图形变换 本项目将通过变换矩阵,对【OpenGL学习】(七)纹理单元 中的图形进行缩放…

从理论到实战:解密大型语言模型的核心技术与应用指南

一、Transformer:语言理解与生成的基石 Transformer 架构的出现,彻底改变了自然语言处理(NLP)的格局。它以“注意力”为核心,将全局依赖的捕捉效率推向新高。下面用 图简要概览其数据流: 从上图可见&#…

kali换源

在Kali Linux中切换软件源可以提高软件下载速度,下面为你介绍切换源的方法。 一、备份原配置文件 首先备份原配置文件,避免操作失误导致问题: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak二、编辑源配置文件 使用以下命令编…

从决策树到随机森林:Python机器学习里的“树形家族“深度实战与原理拆解

引言 在机器学习的算法森林中,有一对"树形兄弟"始终占据着C位——决策树像个逻辑清晰的"老教授",用可视化的树状结构把复杂决策过程拆解成"是/否"的简单判断;而它的进阶版随机森林更像一支"精英军团&quo…

uniapp,每次请求时,中断上次请求

1.封装uni.request import {BASE_URL} from "/config/config.js"import store from "/store/index.js"; class RequestManager {constructor() {this.requestTasks new Map() // 存储所有请求任务this.baseURL BASE_URLthis.header {Content-Type: app…

DuDuTalk | 武汉赛思云科技有限公司通过武汉市人工智能企业认定!

近日,2025年武汉市人工智能企业名单正式公布!武汉赛思云科技有限公司(以下简称赛思云科技)凭借卓越的技术实力与创新成果,成功入选武汉市人工智能企业。这是对公司长期深耕AI语音智能领域、推动数字化转型的高度认可&a…

STM32实现傅里叶变换精确计算采样电流值

以下是基于离散傅里叶变换(DFT)算法在单片机上实现精确电流值计算的全流程指南,结合硬件选型、算法优化、代码实现及实际应用场景分析,综合多篇技术文档的实践要点: ⚙️ 一、系统设计核心要点 硬件选型与配置 单片机选择:优先采用带硬件浮点单元(FPU)的STM32F4/F7系列…

python 爬虫 下载视频

测试 OK II 在开发者工具里面 直接搜索m3u8 可以直接找相对应连接地址继续分析 这个m3u8 url地址是从哪里过来的 在什么地方有 III 我们想要视频数据 <m3u8连接> 在 网页源代码里面有获取整个视频内容 --》分为N个视频片段《ts文件》-->在m3u8连接里面--> 视频播放…

希尔伯特空间:无穷维度的几何世界

希尔伯特空间&#xff1a;无穷维度的几何世界 从量子物理到信号处理&#xff0c;希尔伯特空间为现代科学与工程提供了强大的数学框架 引言&#xff1a;无限维度的舞台 在数学和物理学的广阔领域中&#xff0c;希尔伯特空间扮演着至关重要的角色。这个完备的内积空间不仅推广了…

Transformer结构与代码实现详解

参考&#xff1a; Transformer模型详解&#xff08;图解最完整版&#xff09; - 知乎https://zhuanlan.zhihu.com/p/338817680GitHub - liaoyanqing666/transformer_pytorch: 完整的原版transformer程序&#xff0c;complete origin transformer programhttps://github.com/lia…