Python的面向对象、封装、继承、多态相关的定义,用法,意义

news/2024/4/29 0:51:15/文章来源:https://blog.csdn.net/ydl1128/article/details/137069555

面向对象编程(OOP)是一种编程范式,它使用对象的概念来模拟现实世界的实体,并通过类(Class)来创建这些实体的蓝图。OOP的核心概念包括封装、继承和多态。

Python中的面向对象编程

在Python中,一切皆对象,所有的数据类型都是对象,包括整数、浮点数、字符串等基本数据类型,以及列表、元组、字典等容器类型。Python支持面向对象编程,并提供了类(class)和对象(object)的机制来实现面向对象编程。

封装(Encapsulation)

封装是将对象的数据(属性)和行为(方法)结合在一起,并对外隐藏其内部实现细节的过程。这提高了代码的安全性和可维护性,因为对象的内部状态只能通过定义良好的接口(方法)来访问和修改。

用法示例:

class Person:def __init__(self, name, age):self.__name = name  # 私有属性self.__age = age    # 私有属性def get_name(self):  # 公开方法return self.__namedef set_name(self, name):  # 公开方法self.__name = namedef get_age(self):  # 公开方法return self.__agedef set_age(self, age):  # 公开方法self.__age = ageperson = Person("Alice", 30)
print(person.get_name())  # 输出: Alice
person.set_name("Bob")
print(person.get_name())  # 输出: Bob

继承(Inheritance)

继承是一种创建新类的方式,新类(子类)继承现有类(父类)的属性和方法。这允许代码重用,并可以建立类之间的层次关系。

用法示例:

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement this method")# pass 保持程序的完整性class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 输出: Woof!
print(cat.speak())  # 输出: Meow!

多态(Polymorphism)

多态是指不同类的对象可以以统一的接口响应相同的消息。在Python中,多态允许不同的对象对同一方法的调用产生不同的行为。

用法示例:

def make_animal_speak(animal):print(animal.speak())dog = Dog("Rex")
cat = Cat("Luna")
make_animal_speak(dog)  # 输出: Woof!
make_animal_speak(cat)  # 输出: Meow!

在这个例子中,make_animal_speak函数可以接受任何Animal的子类实例,并调用其speak方法,而不需要知道对象的具体类型。

super() 关键字

super()是Python中用于调用父类(超类)方法的内置函数,尤其在继承关系中非常有用。它允许子类利用父类的方法实现,而不需要显式地写出父类的名称。在面向对象编程中,当在子类中重写父类的方法时,有时可能需要在子类的方法中调用父类相同的方法。在这种情况下,super()提供了一种优雅的方式来实现这一点,它确保了方法的继承链被正确地维护。

super()的语法如下:

super([typename][, object-or-type])
  • typename 是类的名称。
  • object-or-type 是一个可选参数,表示类的实例或者类类型。

在Python中,super()函数用于调用父类的方法。它提供了一种方便的方式来调用父类的方法,特别是在多继承的情况下。super()函数通常与__init__()方法一起使用,以确保所有父类的__init__()方法都得到正确调用,从而避免代码中的冗余和重复。

用法示例:

考虑一个简单的类继承关系,父类为Parent,子类为Child。我们在子类中想要调用父类的方法。

class Parent:def __init__(self):self.parent_name = "Parent"def show_name(self):print("Parent Name:", self.parent_name)class Child(Parent):def __init__(self):super().__init__()  # 调用父类的初始化方法self.child_name = "Child"def show_name(self):super().show_name()  # 调用父类的方法print("Child Name:", self.child_name)child = Child()
child.show_name()

输出结果为:

Parent Name: Parent
Child Name: Child

在上面的示例中,Child类继承自Parent类。在Child类的__init__()方法中,我们使用super()函数来调用父类Parent__init__()方法,以确保父类的属性得到正确初始化。在Child类的show_name()方法中,我们也使用super()函数来调用父类Parentshow_name()方法,以打印父类的名称。这种方式使得子类可以继承父类的方法,同时也可以在子类中进行适当的修改和扩展。

总之,super()函数是Python中用于调用父类方法的关键字,它提供了一种方便的方式来实现子类对父类方法的调用,从而使得代码更加简洁和可维护。

方法重写(Overriding)

方法重写是指在子类中重新实现父类中已有的方法。这是多态的基础之一,它允许子类根据需要提供不同的方法实现。在Python中,如果子类的方法与父类的方法签名(即方法名和参数列表)相同,那么这个方法就会被重写。

用法示例:

class Animal:def speak(self):raise NotImplementedError("Subclass must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def make_animal_speak(animal):print(animal.speak())dog = Dog()
cat = Cat()
make_animal_speak(dog)  # 输出: Woof!
make_animal_speak(cat)  # 输出: Meow!

在这个例子中,DogCat类通过继承Animal类并重写speak方法来实现多态。make_animal_speak函数可以接受任何Animal的子类实例,并调用其speak方法,而不需要知道对象的具体类型。

方法重载(Overloading)

方法重载是指在同一个类中,可以有多个同名方法,只要它们的参数列表不同(参数的数量或类型不同)。这使得可以用一个统一的接口处理不同类型的输入。需要注意的是,Python并不直接支持方法重载,因为它是基于方法签名的,所以实现重载通常需要一些创造性的解决方案,如使用默认参数、*args和**kwargs等。

用法示例:

def my_function(*args, **kwargs):if len(args) == 1 and isinstance(args[0], int):print("Received an integer:", args[0])elif len(kwargs) == 1:print("Received a keyword argument:", kwargs)my_function(10)  # 输出: Received an integer: 10
my_function(name="Kimi")  # 输出: Received a keyword argument: {'name': 'Kimi'}

在这个例子中,my_function通过接受任意数量的位置参数和关键字参数来模拟重载的行为。

方法的重写和重载是实现多态的重要手段。通过重写,子类可以提供父类方法的新实现,而多态允许这些方法在运行时根据对象的实际类型被调用。
继承是OOP中的一个基本概念,它允许我们创建基于现有类的新类,从而促进代码的重用和减少重复。
重载在Python中不像在静态类型语言中那样直接支持,但可以通过一些技巧来模拟实现。
理解和正确使用这些概念可以帮助编写更加灵活、可扩展和可维护的代码。

总结

面向对象编程通过封装、继承和多态提供了一种强大的代码组织方式。封装隐藏了对象的内部实现,使得对象易于使用和维护。继承允许我们通过重用代码来减少重复劳动,同时建立类之间的关系。多态使得我们可以编写更通用的代码,处理不同类型的对象。

完整代码案例

下面是一个完整的代码案例,展示了一个简单的车辆管理系统,其中包含封装、继承和多态的使用:

class Vehicle:def __init__(self, make, model, year):self._make = makeself._model = modelself._year = yeardef get_details(self):return f"{self._make} {self._model}, {self._year}"class Car(Vehicle):def __init__(self, make, model, year, doors):super().__init__(make, model, year)self._doors = doorsdef get_details(self):details = super().get_details()return f"{details}, Doors: {self._doors}"class Truck(Vehicle):def __init__(self, make, model, year, cargo_capacity):super().__init__(make, model, year)self._cargo_capacity = cargo_capacitydef get_details(self):details = super().get_details()return f"{details}, Cargo Capacity: {self._cargo_capacity} kg"def display_vehicle_details(vehicle):print(vehicle.get_details())# 创建车辆实例
car = Car("Toyota", "Corolla", 2020, 4)
truck = Truck("Ford", "F-150", 2019, 1000)# 显示车辆详细信息
display_vehicle_details(car)  # 输出: Toyota Corolla, 2020, Doors: 4
display_vehicle_details(truck)  # 输出: Ford F-150, 2019, Cargo Capacity: 1000 kg

在这个案例中,定义了一个基类Vehicle和两个子类CarTruck。每个类都实现了get_details方法,这是多态的一个例子。我们创建了CarTruck的实例,并通过display_vehicle_details函数显示它们的详细信息,而这个函数不知道对象的具体类型,它只依赖于Vehicle基类的接口。这展示了如何通过OOP来构建灵活和可扩展的代码。

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

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

相关文章

R语言基础入门

1.保存或加载工作空间 改变工作目录——进行文件读写,默认去指定文件进行操作。(使用R时,最好先设定工作目录(setwd(),getwd())) setwd(“工作文件路径”):建立工作目录 getwd(&…

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…

C语言与sqlite3入门

c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…

计算机毕业设计Hadoop+Spark+Hive租房推荐系统 贝壳租房数据分析 租房爬虫 租房可视化 租房大数据 大数据毕业设计 大数据毕设 机器学习

毕业技术方向调查表 姓名: 李昌福 课题方向 房无忧房屋租赁平台 开发语言: Java 前端框架: VUE 数据库: MySQL 服务器端 框架: SpringCloud 其他技术: Hadoop、HDFS 方向…

HTML网站的概念

目录 前言: 1.什么是网页: 2.什么是网站: 示例: 3.服务器: 总结: 前言: HTML也称Hyper Text Markup Language,意思是超文本标记语言,同时HTML也是前端的基础&…

二叉树初阶数据结构C

文章目录 一、树的概念及结构?1.树的概念2.树的相关概念3.树的表示4.树在实际生活的应用(表示文件系统的目录树结构) 二、二叉树的概念及结构1.概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储结构 三、二叉树链式结构的实现(顺序结构之前讲…

maven 依赖机制

安全工程师为啥关注maven依赖 log 4j事件之后,大家开始更加关注开源组件安全漏洞这个事。纷纷引入SCA 软件成分分析工具来识别项目中存在的开源组件和漏洞。 在sca工具扫描之后,会报出一大堆组件,review这个事就是安全团队投入时间来研判了…

解锁未知领域:探索Web3技术的无限可能性

随着数字化时代的持续发展,Web3技术作为下一代互联网的重要组成部分,正呈现出无限的创新可能性。本文将深入探索Web3技术所带来的无限可能性,揭示其在各个领域的应用前景和潜力。 1. 区块链技术的革命性 Web3的核心是区块链技术,…

C++商品库存管理系统

第一章 需求分析 1.1程序设计任务 1.1.1总体要求 运用面向对象程序设计知识,利用C语言设计和实现一个“库存管理系统设计”,主要完成对商品的销售、统计和简单管理。在实现过程中,需利用面向对象程序设计理论的基础知识,充分体现…

Webpack常见插件和模式

目录 目录 目录认识 PluginCleanWebpackPluginHtmlWebpackPlugin自定义模版 DefinePlugin的介绍 ( 持续更新 )Mode 配置 认识 Plugin Loader是用于特定的模块类型进行转换; Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等 …

【zlm】问题记录:chrome更新引起的拉不出webrtc; 证书校验引起的放几秒中断

目录 chrome更新引起的拉不出webrtc 证书校验引起的放几秒中断 chrome更新引起的拉不出webrtc 【zlm】最新的chrome版本中的报错: 我有个问题event.js:8 [RTCPusherPlayer] DOMException: Failed to execute setRemoteDescription on RTCPeerConnection: Failed …

Java前端控制器模式

文章目录 以下是Java前端控制器模式的主要组成部分和工作原理:组件与角色:工作流程:应用场景与优势: Java Web应用程序示例 Java前端控制器模式是一种软件设计模式,它在构建基于Java的Web应用程序时特别有用&#xff0…

如何使用 ArcGIS Pro 制作三维建筑

三维地图已经逐渐成为未来地图的趋势,对于大范围应用,只需要普通的建筑体块就行,如果有高程数据,还可以结合地形进行显示,这里为大家介绍一下 ArcGIS Pro 制作三维建筑的方法,希望能对你有所帮助。 数据来…

使用seldom编写http接口用例

在编写接口用例的过程中,针对一个接口,往往只是参数不同,那么参数化就非常有必要了。 seldom 中参数化的用法非常灵活,这里仅介绍file_data() 的N种玩法。 二维列表 当参数比较简单时可以试试下面的方式。 参数化数据 {"…

老阳推荐的视频号项目是真的吗?能赚钱吗?

在当下数字化、信息化的社会背景下,视频号项目如雨后春笋般涌现,成为许多人关注的焦点。特别是在一些知名人士,如老阳的推荐下,这些项目更是受到了广泛的关注和讨论。那么,老阳推荐的视频号项目是否真实存在?它能否真…

uni-app(使用阿里图标)

1.注册阿里矢量图标库 注册阿里图标库账号并登录,https://www.iconfont.cn/ 2.加入购物车 搜索适合自己的图标,加入购物车,如下图: 3.加入项目 我的->资源管理->我的项目->创建项目,然后返回购物车&#…

cesium vue 绘制标记实体(撒点),监听鼠标左击事件

添加实体 const viewer new Cesium.Viewer(cesiumContainer, {})viewer.entities.add()查看实体 const viewer new Cesium.Viewer(cesiumContainer, {}) const billboard viewer.entities.add({...})viewer.zoomTo(billboard)删除实体 根据实体删除 if (billboard.value…

快速上手Spring Cloud 六:容器化与微服务化

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

目标检测+车道线识别+追踪

一种方法: 车道线检测-canny边缘检测-霍夫变换 一、什么是霍夫变换 霍夫变换(Hough Transform)是一种在图像处理和计算机视觉中广泛使用的特征检测技术,主要用于识别图像中的几何形状,尤其是直线、圆和椭圆等常见形状…

C++从入门到精通——函数重载

函数重载 前言一、函数重载概念二、函数重载的分类参数类型不同的函数重载参数个数不同的函数重载参数类型顺序不同的函数重载 三、函数重载的具体代码展示main.cpp 四、为什么为什么C支持函数重载,而C语言不支持函数重载呢 前言 函数重载是指在同一个作用域内&…