Python中面向对象编程思想

embedded/2024/12/23 14:47:03/

目录

前言

一、面向对象是什么?

二、编程的核心概念

1.类与对象

2.常见类内置方法

小结

 三、面向对象编程的特性

四、实例分析

总结


前言

        本文旨在深入探讨Python中的面向对象编程(OOP)概念,包括其核心思想、实现方式以及最佳实践。我们将从OOP的基础知识入手,逐步深入到更高级的特性,如继承、多态和封装,并探讨如何在实际编程中应用这些概念。

一、面向对象是什么?

        面向对象编程是一种编程范式,它将现实世界中的实体抽象为代码中的对象。Python作为一种动态、解释型的高级编程语言,其设计哲学之一就是简洁明了,这使得Python成为学习和使用面向对象编程的理想选择。

        不妨举例说明,以手机为例,手机具备各种各样的功能,能够上网、打电话、玩游戏、听歌等。通过一系列的操作来完成对于手机这个个体的操作。手机这个个体高度集中了各种操作方法,无需关心内部是如何操作的。同样在面向对象编程中,自定义各种各样的类,不用关心各个类内部结构和如何实现的。

        类就好比一组具有相同属性和功能的对象的抽象。比如说汽车这个概念,一辆车具备什么样的属性呢?即:颜色、型号、速度等属性。操作方法有启动、加速、刹车等功能。此时汽车的属性就好比自定义类中的成员变量,操作方法就好于这个类方法中的自定义函数。当创建类时,此时则是对于这个类的实例,它时具体的

二、编程的核心概念

1.类与对象

        在Python中,类是创建对象的蓝图。对象是类的实例,拥有自己的状态(属性)和行为(方法)。代码如下(示例):

python">class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclasses must implement this method")# 创建Animal类的一个实例
my_animal = Animal("Generic Animal")

        此段代码创建了一个名为“Animal”的类,该类下方定义了一个“__init__”和“speak"的行为方法。my_animal则是对于该类的实例化。值得注意的是,在方法定义的参数列表中,有一个self关键字,该关键字是必须填写的,它表示类对象自身的意思,或者是当我们使用类对象调用方法时,self会被python自动传入。在方法内部时,要想访问类的成员变量类型,必须使用self。

2.常见类内置方法

(1)__init__()方法

        在python中,假设目前自定义了一个类,类中包含了各种各样的成员变量,但是实际开发中需要对此时类中的成员变量进行赋值,若单独对每一变量进行赋值则会造成代码冗余,此时不妨使用构造方法,即:__init__()创建成员变量,代码如下(示例):

python">class Student:def __init__(self,name,age,tel):self.name = nameself.age = ageself.tel = tel
stu = Student(Vaule1,Vaule2,Vaule3)

        此时的成员变量name,age,tel作为形式参数,当构建Student类的实例化时,则可以直接向三个参数传递参数值。(注意:构造方法也是成员方法,不要忘记在参数列表中提供:self在构造方法内定义成员变量,需要使用self关键字,这是因为不管是构建方法还是定义成员变量,都需要使用self来表示。

(2)__str__字符串方法

        实际开发过程中,需要对被调用的成员变量进行打印,此时需要进行类型转换,即将控制类转化为字符串的行为,此时则有:

python">class Student:def __init__(self,name,age):self.name = nameself.age = agedef __str__(self):return f"student类对象,name={self.name},age={self.age}"
student = Student("Value",11)
print(student)
print(str(student))

(3) __It__小于符号的比较方法

        同样,实际开发过程中不可能直接对于2个对象进行比较,不过可以调用__lt__方法进行实现,即可完成大于符号和小于符号两种比较方法。此时则有:

python">class Student:def __init__(self,name,age):self.name = nameself.age = agedef __lt__(self,other):return self.age < other.age
stu1 = Student("Value1",Value2)
stu2 = Student("Value3",Value4)
print(stu1<stu2) #结果 True
print(stu1>stu2) #结果 False

(4)__le__小于等于比较符号方法 

         __le__可用于:<=>=两种比较运算符

python">class Student:def __init__(self,name,age):self.name = nameself.age = agedef __le__(self,other):return self.age <= other.age
stu1 = Student(...) #同上,此处省略
....
....

(5) __eq__比较运算符的实现方法

        __eq__方法可用于比较两个参数值是否一样,即:比较所传递进的参数值是否一致,内容可以自定义,返回值为True/False

python">class Sutdent:def __init__(self,name.age):self.name = nameself.age = agedef __eq__(self,other):return self.age == other.age

3.小结

        __init__方法 通常用于创建类对象时设置为初始化行为,而__str__用于实现类对象转字符串的行为;__lt__用于两个类对象进行小于或者大于比较;__le__用于两个类对象进行小于等于或者大于等于的比较;__eq__用于两个类对象进行相等比较。

 三、面向对象编程的特性

        面向对象编程有三大特性,封装、继承和多态。

(1)封装

        封装是将数据和操作封装成类,隐藏具体实现,使代码模块化。例如,汽车类封装了颜色、型号等属性和启动、加速等方法,用户只需了解接口,无需关心内部实现。

(2)继承

        继承允许扩展现有类的功能而无需重写。例如,电动车类继承汽车类,自动获得其属性和方法,并可添加新特性,如电池容量和充电功能。

(3)多态

        多态性指同一操作在不同对象上有不同的行为。例如,汽车和电动车类都有启动方法,但实现可能不同,体现了多态性。

四、实例分析

(1)封装

        假设目前有个业务场景,即:设计一个手机类,内部包含:私有成员变量:_is_5g_enable,类型bool,True表示开启5g,False表示关闭5g私有成员方法:_check_5g(),会判断私有成员_is_5g_enable的值。若为True,打印输出:5g开启;若为False,打印输出:5g关闭,使用4g网络公开成员方法:call_by_5g(),调用它会执行调用私有成员方法:check_5g0,判断5g网络状态打印输出:正在通话中 

python"># encoding: utf-8
# @File  : test3
# @Author: Hex1911
# @Desc  : 
# @Date  : 2024/12/19
class Phone:def __init__(self):self.__is_5g_enable = False #默认5G关闭def __check_5g(self):if self.__is_5g_enable:print("5g开启")else:print("5g关闭,使用4g网络")def call_by_5g(self):self.__check_5g() #调用私有方法检查5G状态print("正在通话中")
#为了能够从外部设置5G状态,可以添加上一个公开的方法来修改__is_5g_enable的值def set_5g(self,enable):if ininstance(enable,bool):self.__is_5g_enable = enableelse:raise ValueError("enable must be a boolean value")
phone = Phone()
phone.set_5g(True)  # 启用5G
phone.call_by_5g()  # 检查5G状态并打印通话信息phone.set_5g(False)  # 禁用5G
phone.call_by_5g()  # 检查5G状态并打印通话信息

        这段代码中,体现了以下几个核心思想和方法:一是封装,即:代码中的__is_5g_enable属性和__check_5g方法被定义为私有(使用双下划线),意味着不能直接呗类外部直接访问,隐藏了内部实现细节,保护了对象的状态,只允许通过类提供的公共接口进行交互。二是抽象,通过提供公共方法set_5g和call_by_5g,代码隐藏了__is_5g_enable属性和__check_5g方法的具体实现。三是方法调用,call_by_5g方法中调用了私有方法__check_5g展示了如何在类的内部通过方法调用来执行特定行为的 。

(2)继承

        基于以上代码,不妨创建一个Smartphone类,可以继承Phone类,增加一些特有的属性和方法,如触摸屏操作或者应用管理,代码如下:

python">class Smartphone(phone):def __init__(self):super().__init__()self.touch_screen = Truedef install_app(self,app_name):print(f"Installing{app_name}on the smartphone.")

        此时Smartphone类继承了Phone类,自动获取了Phone类的所有属性和方法,并且可以添加新的特性,比如说touch_screen属性和install_app方法。 

(3)多态

        多态的概念可以用生活中的“遥控器”来解释一下,假设此时有一个可以控制多宗电器的遥控器,该遥控器可以控制电视、空调、音响。此遥控器有一个“开/关”按钮,但是针对于具体的每一个电器启动方式则有不同,每一种电器的响应都不一样。此时的实现代码如下:

python">class Appliance:def turn_on(self):raise NotImplementedError("Each appliance must implement this method")def turn_off(self):raise NotImplementedError("Each appliance must implement this method")class TV(Appliance):def turn_on(self):print("TV is turning on.")def turn_off(self):print("TV is turning off.")class AirConditioner(Appliance):def turn_on(self):print("Air conditioner is turning on.")def turn_off(self):print("Air conditioner is turning off.")class Stereo(Appliance):def turn_on(self):print("Stereo is turning on.")def turn_off(self):print("Stereo is turning off.")
a.基类 - 开/关接口

      首先,将“开/关”功能视为一个基类,这个基类定义了一个接口(方法)turn_on()turn_off()。这个接口是所有电器共有的,但具体的实现(即如何开启和关闭)可能因电器而异。

b.子类 - 具体电器

      然后,我们有多个继承自这个基类的子类,每个子类代表一种具体的电器,比如TVAirConditioner(空调)和Stereo(音响)。这些子类都实现了基类中的turn_on()turn_off()方法,但每个方法的具体行为都是根据具体电器的特性来定义的。

c.启动

        使用遥控器上的“开/关”按钮时,不需要知道它具体控制的是哪个电器。简单地按“开/关”按钮,遥控器会根据当前选中的电器(对象的实际类型),调用相应的turn_on()turn_off()方法。

python">def operate_appliance(appliance, action):if action == "on":appliance.turn_on()elif action == "off":appliance.turn_off()# 创建不同的电器实例
tv = TV()
air_conditioner = AirConditioner()
stereo = Stereo()# 使用遥控器操作不同的电器
operate_appliance(tv, "on")  # 输出: TV is turning on.
operate_appliance(stereo, "off")  # 输出: Stereo is turning off.

        在这个例子中,operate_appliance函数接受一个电器对象和一个操作指令("on"或"off")。根据传入的电器对象的实际类型,turn_on()turn_off()方法会有不同的行为,这就是多态性的体现。不需要知道每个电器的具体操作细节,只需要知道它们都遵循同一个接口(“开/关”按钮),就可以通过这个接口来控制它们。

        通过这个遥控器的例子,可以看到多态性是如何允许用统一的方式处理不同的对象,使得操作更加简洁和通用。   


总结

        面向对象编程(OOP)是一种以对象为核心的编程范式,它通过类和对象的概念来设计软件,提高了代码的可读性和可维护性。OOP的核心在于封装,它将数据和相关操作封装在一起,隐藏内部实现细节,仅对外暴露必要的接口。继承允许新类继承现有类的属性和方法,从而扩展或覆盖原有功能。多态性则使得同一个操作在不同对象上可以有不同的行为,增强了代码的灵活性。抽象通过隐藏实现细节,只展示必要的操作,简化了复杂性的管理。接口定义了对象必须遵循的方法和属性,而组合则通过包含其他对象来实现功能,提供了一种不同于继承的代码复用方式。消息传递是对象间通信的手段,特殊方法允许开发者定义对象的特定行为,属性装饰器则将方法作为属性访问,增强了封装性。类变量由所有实例共享,而实例变量则为每个对象所独有。方法绑定则决定了方法是属于实例、类还是静态的。这些特性共同作用,使得OOP成为构建模块化、可维护和可扩展软件系统的有力工具。


http://www.ppmy.cn/embedded/148096.html

相关文章

RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录

文章目录 1、环境介绍2、目标3、海华AW-CM358SM3.1、基本信息3.2、支持SDIO3.03.3、电气特性 4、适配流程步骤5、让SDIO控制器工作&#xff0c;且可以扫到WIFI卡5.1、dts配置5.2、验证 6、Wi-Fi 适配6.1、dts配置6.2、驱动移植6.2.1、kernel menuconfig6.2.2、传统驱动移植6.2.…

【Linux】系统编程--基本概念

更多精彩内容..... &#x1f389;❤️博主の主页✨&#x1f618; Stark、-CSDN博客 操作系统 操作系统&#xff08;operating system&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的计算机程序。 计算机系统由处理器、内存、磁盘、键盘、显示器、网络接口以及各种…

【C++】sophus : sim3.hpp 描述了在 3D 空间中的缩放、旋转和平移 (十九)

sim3.hpp 文件定义了与 Sim(3) 群相关的类和操作。Sim(3) 群描述了在 3D 空间中的缩放、旋转和平移。以下是对该文件主要内容的总结&#xff1a; 主要类和命名空间 命名空间 Sophus Sophus 命名空间包含了与 Sim(3) 群相关的所有类和函数定义。 类模板 Sim3Base Sim3Base 是一个…

数字化制造新生态:共话无代码+AI落地实践

在数字化浪潮席卷各行各业的今天&#xff0c;制造业正迎来前所未有的变革机遇。 如何借助数字化工具实现降本增效&#xff1f; 如何通过技术革新打破传统经营管理的瓶颈&#xff1f; 来自轻流、明洋灵动、酷家乐等企业的多位专家于12月13日&#xff0c;在由轻流与明洋数据联…

(Z Shell)zsh: no matches found: ? 使用单引号包裹

文章目录 dgqdgqdeMac-mini ProductAuthentication % git commit -m "open-type"{{isCodeValid ? getPhoneNumber : none}}"" zsh: no matches found: ?git commit -m open-type"{{isCodeValid ? getPhoneNumber : none}}"你遇到的 zsh: no m…

精通Redis

目录 1.NoSQL 非关系型数据库 2.Redis 3.Redis的java客户端 4.Jedis 4.1Jedis快速入门 4.2Jedis连接池及使用 5.SpringDataRedis和RedisTemplate 6.SpringDataRedis快速入门 7.RedisSerializer 1.NoSQL 非关系型数据库 基础篇-02.初始Redis-认识NoSQL_哔哩哔哩_bilib…

RAG基础知识及综述学习

RAG基础知识及综述学习 前言1.RAG 模块1.1 检索器&#xff08;Retriever&#xff09;1.2 检索融合&#xff08;Retrieval Fusion&#xff09;1.3 生成器&#xff08;Generator&#xff09; 2.构建检索器&#xff08;Retriever&#xff09;2.1 分块语料库2.2 编码文本块2.3 构建…

Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)

XXX has invalid signature 您需要先加载内核 项目需要&#xff0c;需要安装使用Ubuntu和Deepin两个系统&#xff0c;所以在DELL笔记本中&#xff08;自带Win10&#xff09;安装了Ubuntu20.04双系统。 顺利使用双系统&#xff0c;开机可以选择启动项&#xff0c;切换Windows和…