面向对象三大特征(python)

news2024/11/18 13:55:27

 

目录

1. 封装

为什么使用封装?

如何实现封装?

一个简单的封装示例

 二.继承

为什么使用继承?

如何实现继承?

一个简单的继承示例

使用继承的好处

三.多态

为什么使用多态?

如何实现多态?

一个简单的多态示例

使用多态的好处


  1. 封装:封装是指将数据和操作数据的方法捆绑在一起,通过这种方式可以控制数据的访问权限,使得对象的内部细节对外部不可见,从而提高了代码的安全性和可靠性。

  2. 继承:继承是指一个类可以基于另一个类来创建新类的机制。子类可以继承父类的属性和方法,并且可以在不改变父类的情况下扩展或修改功能,从而实现代码的重用和扩展。

  3. 多态:多态是指同一种操作作用于不同的对象时,可以产生不同的行为。通过多态,可以编写通用的代码,让程序在运行时根据对象的实际类型来决定调用哪个方法,提高了代码的灵活性和可扩展性。

1. 封装

封装:面向对象编程的核心原则

在面向对象编程中,封装是一种核心原则,它允许我们将数据和操作封装在一个单独的单元中,从而隐藏了数据的具体实现细节,只暴露出必要的接口供外部使用。这种方式提高了代码的可维护性、可重用性和安全性

为什么使用封装?

封装的主要目的是将数据和操作打包在一起,形成一个独立的单元,外部只能通过指定的接口来访问数据和操作,而不能直接访问内部实现细节。这样做的好处有:

  1. 隐藏实现细节:封装可以隐藏数据的具体实现细节,使得外部无法直接访问和修改数据,从而提高了代码的安全性和可维护性。

  2. 简化接口:封装可以将复杂的实现细节封装在内部,只暴露出简单的接口供外部使用,使得代码更易于理解和使用。

  3. 提高重用性:封装可以将通用的功能封装在一个单元中,使得这些功能可以在不同的地方重复使用,提高了代码的重用性。

如何实现封装?

在面向对象编程中,封装通常通过类和对象来实现。类将数据和操作封装在一起,而对象则是类的实例,可以通过对象来访问封装在类中的数据和操作。

在Python中,我们可以使用访问控制符(如私有成员变量和方法)来实现封装。通过将属性或方法命名以双下划线开头,我们可以将它们设置为私有的外部无法直接访问,只能通过类提供的接口来访问。

一个简单的封装示例

让我们通过一个简单的例子来说明封装的概念。假设我们有一个 Person 类,表示一个人,其中包含姓名和年龄两个属性,我们希望将年龄设置为私有的,只能通过提供的接口来访问。

class BankAccount:
    def __init__(self, account_number, balance=0):
        self.account_number = account_number
        self.__balance = balance  # 封装的私有属性

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Deposit of {amount} successful.")
        else:
            print("Invalid deposit amount.")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"Withdrawal of {amount} successful.")
        else:
            print("Invalid withdrawal amount.")

    def get_balance(self):
        return self.__balance


# 创建银行账户对象
acc1 = BankAccount("12345678", 1000)

# 尝试直接访问私有属性
# print(acc1.__balance)  # 无法直接访问私有属性

# 通过公有方法访问私有属性
print("Current balance:", acc1.get_balance())

# 进行存款和取款操作
acc1.deposit(500)
print("Current balance after deposit:", acc1.get_balance())

acc1.withdraw(200)
print("Current balance after withdrawal:", acc1.get_balance())

这个示例中,BankAccount 类封装了账户号码和账户余额,其中 __balance 是私有属性,通过 deposit() 和 withdraw() 方法实现对账户余额的操作,同时通过 get_balance() 方法来获取账户余额。

 二.继承

为什么使用继承?

继承允许我们建立一个层次结构,通过在父类中定义通用的属性和方法,然后在子类中添加特定的功能或行为,从而实现代码的重用和扩展。这种方法使得代码更加模块化,易于理解和维护。

如何实现继承?

在Python中,实现继承非常简单。我们可以通过在子类的定义中将父类作为参数传递给子类来实现继承。子类继承了父类的所有属性和方法,并可以添加新的属性和方法或覆盖父类的方法。

一个简单的继承示例

# 父类
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        return f"{self.name} 叫!"


# 子类继承父类
class Dog(Animal):
    def Dog_speak(self):
        return super().speak()


class Cat(Animal):
    def Dog_speak(self):
        return super().speak()


# 创建对象并调用方法
dog = Dog("狗")
print(dog.speak())

cat = Cat("猫")
print(cat.speak())

使用继承的好处

通过继承,我们可以避免重复编写相似的代码,提高了代码的复用性。当我们需要添加新的功能或行为时,只需要在子类中进行修改,而不需要修改父类,这样可以减少代码的维护成本。

继承还使得代码更具灵活性和可扩展性,我们可以轻松地添加新的子类来扩展现有的功能,而不会影响到其他部分的代码。

三.多态

多态:面向对象编程的灵活性之道

在面向对象编程中,多态是一种重要的概念,它允许我们使用统一的接口来操作不同类型的对象,从而实现灵活性和可扩展性。多态使得代码更加通用、易于理解和维护。

为什么使用多态?

多态的主要目的是提高代码的灵活性和可扩展性。通过多态,我们可以编写与具体类型无关的代码,从而使得代码更加通用和可重用。当我们需要添加新的类型时,只需要编写新的类并实现相同的接口,而不需要修改现有的代码,这样大大提高了代码的可维护性和可扩展性。

如何实现多态?

在面向对象编程中,多态通常通过继承和方法重写来实现。当子类继承自父类,并重写了父类的方法时,我们可以使用父类的引用来引用子类的对象,并调用相同的方法,实现了多态。

另一种实现多态的方式是通过接口。在一些编程语言中,如Java,我们可以定义一个接口,并要求所有实现该接口的类都实现相同的方法。然后我们可以使用接口的引用来引用实现了该接口的不同类的对象,并调用相同的方法,实现了多态。

一个简单的多态示例

让我们通过一个简单的例子来说明多态的概念。假设我们有一个 Shape 类,表示形状,其中包含一个 draw() 方法用来绘制形状。然后我们创建了两个子类 Circle 和 Rectangle,分别表示圆和矩形,并重写了 draw() 方法。

class Shape:
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("绘制圆形")

class Rectangle(Shape):
    def draw(self):
        print("绘制矩形")

现在,我们可以使用多态来调用不同子类的 draw() 方法,而不需要知道具体是哪个子类。

def draw_shape(shape):
    shape.draw()

circle = Circle()
rectangle = Rectangle()

draw_shape(circle)     # 输出:绘制圆形
draw_shape(rectangle)  # 输出:绘制矩形

在这个例子中,draw_shape() 函数接受一个 Shape 类型的参数,然后调用该参数的 draw() 方法。由于 Circle 和 Rectangle 类都继承自 Shape 类,并重写了 draw() 方法,因此我们可以传递 Circle 和 Rectangle 类的对象作为参数,实现了多态。

使用多态的好处

多态使得代码更加灵活、通用和易于扩展。通过统一的接口操作不同类型的对象,我们可以编写与具体类型无关的代码,提高了代码的可重用性和可维护性。当我们需要添加新的类型时,只需要实现相同的接口,而不需要修改现有的代码,这样大大降低了代码的维护成本

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

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

相关文章

【已解决】电脑设置notepad++默认打开txt

1、以管理员的方式打开notepad 步骤&#xff1a;打开设置 -> 首选项 -> 文件关联 2、 设置Notepad默认打开 按照以下步骤将Notepad设置为默认打开.txt文件&#xff1a; 右键单击任何一个.txt文件。选择“属性”。在“常规”选项卡中&#xff0c;找到“打开方式”&#…

Windows SMBGhost CVE-2020-0796 Elevate Privileges

SMBGhost CVE-2020-0796 Microsoft Windows 10 (1903/1909) - ‘SMBGhost’ SMB3.1.1 ‘SMB2_COMPRESSION_CAPABILITIES’ Local Privilege Escalation https://www.exploit-db.com/exploits/48267 Github https://github.com/danigargu/CVE-2020-0796 修改载荷[可选] 生成 c# …

删除链表的倒数第n个节点的最优算法实现

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 提示&#xff1a; 链表中结点的数目为 sz 1 < sz < 300 < Node.val < 1001 < n < sz 你能尝试使用一趟扫描实现吗&#xff1f; 具体实现 要删除链表的倒数第 n 个…

Linux动态追踪——eBPF

目录 摘要 1 什么是 eBPF 2 eBPF 支持的功能 3 BCC 4 编写脚本 5 总结 6 附 摘要 ftrace 和 perf 与 ebpf 同为 linux 内核提供的动态追踪工具&#xff0c;其中 ftrace 侧重于事件跟踪和内核行为的实时分析&#xff0c;perf 更侧重于性能分析和事件统计&#xff0c;与…

Json-server 模拟后端接口

json-server&#xff0c;模拟rest接口&#xff0c;自动生成增删改查接口。(官网地址&#xff1a;json-server - npm) 使用方法&#xff1a; 1. 安装json-server&#xff0c;npm i json-server -g 2. 创建json文件&#xff0c;文件中存储list数据&#xff0c;db.json {"…

路由器本地docker 下载node容器部署 thressjs文档

1. 每次启动本地文档太麻烦 &#xff0c;路由器刚好支持docker&#xff08;tp-link6088&#xff09; &#xff0c;部署上去自启动 2.

简述MASM宏汇编

Hello , 我是小恒不会java。今天写写x86相关底层的东西 寄存器 8086由BIU和EU组成 8088/8086寄存器有14个。8通用&#xff0c;4段&#xff0c;1指针&#xff0c;1标志 8个通用寄存器&#xff1a;这些寄存器可以用来存储任意类型的数据&#xff0c;包括整数、地址等。8086有8个…

PyTorch Conv2d 前向传递中发生了什么?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

如何更好的管理个人财务?使用极空间部署私有记账系统Firefly III

如何更好的管理个人财务&#xff1f;使用极空间部署私有记账系统Firefly III 哈喽小伙伴们好&#xff0c;我是Stark-C~ 不知道屏幕前的各位“富哥”日常生活中是怎么管理自己巨额财富的&#xff0c;反正对于像我这样年薪过千的摸鱼族来说&#xff0c;请一个专业的理财顾问多多…

【论文阅读】互连网络的负载平衡路由算法 (RLB RLBth)

前言Oblivious Load Balancing 不经意路由负载平衡 1. oblivious routing 不经意/无关路由的背景知识 1. oblivious routing, adaptive routing & minimal/non-minimal routing algorithms 2. Balancing a 1-Dimensional ring: RLB and RLBth 一维 ring 的 RLB and RLBth 1…

JavaEE初阶之IO流快速顿悟一(超详细)

目录 题外话 正题 IO流 Java.io.FileInputStream int read() int read(byte[] b) 关于异常 Java7的新特性: try-with-resources ( 资源自动关闭) Java.io.FileOutputStream void write(int b) void write(byte[] b) 小结 题外话 十年青铜无人问,一朝顿悟冲王者 前天…

会声会影滤镜怎么用 会声会影滤镜效果怎么调 会声会影视频制作教程

在进行视频剪辑时&#xff0c;合理地运用滤镜效果可以提升视频的观赏性&#xff0c;使你的作品更加出彩。这篇文章便一起来学习会声会影滤镜怎么用&#xff0c;会声会影滤镜效果怎么调。 一、会声会影滤镜怎么用 使用会声会影的滤镜效果非常简单&#xff0c;以下是具体的操作…

Linux部署MySQL

部署MySQL 先停掉虚拟机中的MySQL&#xff0c;确保你的虚拟机已经安装Docker&#xff0c;且网络开通的情况下&#xff0c;执行下面命令即可安装MySQL&#xff1a; docker run -d \ --name mysql \ -p 3306:3306 \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORD123 \ mysql 安…

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming&#xff0c;也就是面向切面编程&#xff0c;是一种思想。它是针对OOP(面向对象编程)的一种补充&#xff0c;是对某一类事情的集中处理。比如一个博客网站的登陆验证功能&#xff0c;在用户进行新增、编辑、删除博…

【算法分析与设计】重复的DNA

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究…

【架构方法论(一)】架构的定义与架构要解决的问题

文章目录 一. 架构定义与架构的作用1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构&#xff1a;4R 架构 二、架构设计的真正目的-别掉入架构设计的误区1. 是为了解决软件复杂度2. 简单的复杂度分析案例 三. 案例思考 本文关键字 架构定义 架构与系统的关系从业务逻…

前端零代码开发实践:页面嵌套+逻辑连线0开发扩展组件,实现切换开关控制扇叶转动。能无代码封装扩展组件,有别于常规的web组态或低代码平台

前言&#xff1a; 官网:http://www.uiotos.net/ 什么是 UIOTOS&#xff1f; 这是一款拥有独创专利技术的前端零代码工具&#xff0c;专注于解决前端界面开发定制难题&#xff0c;原型即应用&#xff01;具有页面嵌套、属性继承、节点连线等全新特性&#xff0c;学习门槛低…

OpenCV 如何实现边缘检测器

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现拉普拉斯算子的离散模拟 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数…

基于RK3588的全国产鸿蒙边缘计算工控机在智能交通ETC收费系统的应用

1.1 产品简介 基于智能交通、工业互联等行业快速智能化发展的需求&#xff0c;以 OpenHarmony 为框架开发嵌入 HamonyOS&#xff0c;打造了具有高智能、高可靠、高安全的自主 可控的边缘处理器 XM-RK3588。 图 1-1 边缘处理器 HamonyOS强化 IoT 互联互动能力&#xff0c;让边缘…

【JAVA基础之IO】字节流、字符流以及乱码问题

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1. IO概述 1.1 什么是IO 1.2 IO的分类 1.3 字节和字符流的顶级父类 2. 字节流 2.1 一切皆为字节 2.2 字节输出流【OutputStream】 2.3 FileOutputStream类…