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

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.lryc.cn/news/577052.html

相关文章:

  • LRU缓存设计与实现详解
  • XWPFDocument导出word文件
  • 使用component封装组件和h函数的用法
  • 71. 简化路径 —day94
  • Utils系列之内存池(Fixed size)
  • Elasticsearch 集群升级实战指引—7.x 升级到 8.x
  • 【C++】C++中的友元函数和友元类
  • Prompt Depth Anything:以提示方式驱动的Depth Anything用于实现4K分辨率下的精确米制深度估计
  • 大事件项目记录12-文章管理接口开发-总
  • 【学习】《算法图解》第八章学习笔记:平衡树
  • springboot校园新闻网站
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(三)- 职位数据统计分析
  • 二叉树找到下一个中序遍历节点的思路
  • MATLAB仿真:经过大气湍流的涡旋光束的光斑漂移
  • 消息队列:Redis Stream到RabbitMQ的转换
  • python中*args, **kwargs到底是什么意思
  • Mac使用VMware安装win11使用Origin绘图巨卡解决办法
  • linux运维学习第10周
  • 智能新纪元:大语言模型如何重塑电商“人货场”经典范式
  • 条件概率:不确定性决策的基石
  • Oracle 递归 + Decode + 分组函数实现复杂树形统计进阶(第二课)
  • 中介者模式 - Flutter中的通信指挥中心,告别组件间混乱对话!
  • 怎样学习STM32
  • Springboot 集成 SpringBatch 批处理组件
  • 2.安装Docker
  • 力扣第87题-扰乱字符串
  • 如何通过自动化减少重复性工作
  • Vue中的v-if与emit事件传递:一个常见陷阱分析
  • 推荐几本关于网络安全的书
  • FastAPI+Sqlite+HTML的登录注册与文件上传系统:完整实现指南