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

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

面向对象编程(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来构建灵活和可扩展的代码。

相关文章:

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

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

Elasticsearch 向量搜索

目标记录 ["你好,我的爱人","你好,我的爱妻","你好,我的病人","世界真美丽"] 搜索词 爱人 预期返回 ["你好,我的爱人","你好,我的爱妻"] 示例代码…...

2024蓝桥杯每日一题(背包)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:货币系统 试题二:01背包问题 试题三:完全背包问题 试题一:货币系统 【题目描述】 给定 V 种货币(单位:元),每…...

Redis桌面客户端

3.4.Redis桌面客户端 安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括: 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1…...

让Unity的协程变得简单

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢…...

2.9 Python缩进规则(包含快捷键)

Python缩进规则(包含快捷键) 和其它程序设计语言(如 Java、C 语言)采用大括号“{}”分隔代码块不同,Python采用代码缩进和冒号( : )来区分代码块之间的层次。 在 Python 中,对于类…...

任务记录.

播放器端的解码同步问题 miracast的投屏问题,进行修改的问题。 播放器ffplay命令没有声音的修改问题。 任务:如何将断开连接后在连接发送的数据,两秒后再去显示。 猜测: 一直在监听。断开后要求2秒后的数据再显示。那么也就是认为…...

andv vue 实现多张图片上传

1、提示 注意::: 便利出来的数组 点击保存需要 把 双引号去掉 this.formData.image this.imageUrlList.filter((image) > image ! ) 注意::: 回显的时候需要 再把 双引号加上 …...

使用JMeter+Grafana+Influxdb搭建可视化性能测试监控平台

【背景说明】 使用jmeter进行性能测试时,工具自带的查看结果方式往往不够直观和明了,所以我们需要搭建一个可视化监控平台来完成结果监控,这里我们采用三种JMeterGrafanaInfluxdb的方法来完成平台搭建 【实现原理】 通过influxdb数据库存储…...

django模板下,vue的使用(前后端不分离)

目录 关于djangovue的结合使用一、在你的templates中引入vue.js二、关于vue与django模板变量的冲突问题三、示例结语 关于djangovue的结合使用 网上的相关教程基本上都是部署node.js,npm安装vue,生成vue项目,然后将vue项目部署至django,这些…...

python笔记(7)List(列表)

目录 创建列表 取列表中的值 更新列表 删除元素 脚本操作符 嵌套列表 Python列表函数&方法 创建列表 创建一个列表(List)用方括号[]括起来就可以,数据项之间用逗号作为分隔符,数据项可以是字符串,数字,甚至…...

java 抠取红色印章(透明背景)

一个亲戚让我帮他把照片里的红色印章抠出来,,,记录下处理过程,代码如下,可直接用: public static void signatureProcess(String sourceImagePath, String targetImagePath) {Graphics2D graphics2D null…...

CSS及javascript

一、CSS简介 css是一门语言&#xff0c;用于控制网页的表现。 cascading style sheet:层叠样式表 二、css的导入方式 css代码与html代码的结合方式 &#xff08;1&#xff09;css导入html有三种方式&#xff1a; 1.内联样式&#xff1a;<div style"color:red&quo…...

LeetCode 1997.访问完所有房间的第一天:动态规划(DP)——4行主要代码(不需要什么前缀和)

【LetMeFly】1997.访问完所有房间的第一天&#xff1a;动态规划(DP)——4行主要代码(不需要什么前缀和) 力扣题目链接&#xff1a;https://leetcode.cn/problems/first-day-where-you-have-been-in-all-the-rooms/ 你需要访问 n 个房间&#xff0c;房间从 0 到 n - 1 编号。同…...

BootsJS上新!一个库解决大部分难题!

不知不觉距离第一次发文章介绍自己写的库BootsJS已经过去一个月了&#xff0c;这个月里收到了许许多多JYM的反馈与建议&#xff0c;自己也再一次对BootsJS进行了改进与完善&#xff0c;又一次增加了很多功能&#xff0c;为此我想应该给JYM们汇报汇报这个月的工作进展。 BootJS仓…...

智慧公厕,让数据和技术更好服务社会生活

智慧公厕&#xff0c;作为智慧城市建设中不可忽视的一部分&#xff0c;正逐渐受到越来越多人的关注。随着科技的不断进步&#xff0c;智能化公厕已经成为一种趋势&#xff0c;通过数据的流转和技术的整合&#xff0c;为社会生活带来了更好的服务。本文以智慧公厕源头实力厂家广…...

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎&#xff0c;是一种与 Hadoop 相似的开源集群计算环境&#xff0c;但是两者之间还存在一些不同之处&#xff0c;这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…...

如何使用python链表

在Python中&#xff0c;可以使用类来实现链表的数据结构。链表是一种数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的引用。 下面是一个简单的链表类的示例&#xff1a; class Node:def __init__(self, data):self.data …...

ADB的主要操作命令及详解

ADB&#xff0c;全称Android Debug Bridge&#xff0c;即安卓调试桥&#xff0c;是一个通用的命令行工具&#xff0c;其允许你与模拟器实例或连接的安卓设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对Unix shell&#xff08;可用来…...

傻瓜式启动关闭重启docker容器的脚本

运行脚本后&#xff0c;界面如下&#xff1a; 选择对应的编号后&#xff0c;会列举所有关闭的容器或者所有开启的容器列表&#xff0c;当我要启动一个容器 时输入1&#xff0c;就会出现下面的页面。 然后输入指定的编号后&#xff0c;就会启动对应的容器。 脚本代码如下&#…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...