面向对象三大特征(python)

 

目录

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 类的对象作为参数,实现了多态。

使用多态的好处

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

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

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

相关文章

面向对象介绍

1、面向对象程序设计 2、数据抽象 3、实体、对象、类之间的关系 4、从计算机的观点看对象 5、抽象 6、封装 7、继承 8、多态 9、面向对象编程方法的特性 10、面向对象编程的优缺点

IEEE PDF eXpress Validating Pdf..之后Error in converting file

在将自己写好的pdf论文转化为IEEE出版的pdf论文格式的时候&#xff0c;错误如下图&#xff1a; 解决办法如下&#xff1a;失败之后&#xff0c;那里有一个选项按钮&#xff0c;叫做manual request&#xff0c;也就是人工转换&#xff0c;点那个申请就可以了&#xff0c;然后也挺…

mathtype设置公式编号,公式居中以及编号靠右

在word中实现&#xff1a; 1. 首先点击栏&#xff0c;选择更多栏去看 看到栏的宽度&#xff0c;然后去设置样式 在开始-样式中设置,新建样式&#xff1a; 新建样式&#xff0c;然后设置格式-制表位&#xff0c;选择对齐方式&#xff0c;居中对齐设置刚才的一半&#xff0c;右…

Windows10安装配置nodejs环境

一、下载 下载地址&#xff1a;https://nodejs.cn/download/ ​ 二、安装 1、找到node-v16.17.0-x64.msi安装包, 根据默认提示安装, 过程中间的弹窗不勾选 2、安装完成后, 打开powershell(管理员身份) ​ 3、命令行输入 node -v 和 npm -v 如下图所示则nodejs安装成功 ​ 三…

【线程池总结】

文章目录 线程池介绍线程池的优点线程池的执行流程线程池池参数&#xff1a;线程池的状态常见的线程池FixedThreadPool&#xff08;有限线程数的线程池&#xff09;&#xff1a;ScheduledThreadPool&#xff08;定时线程池&#xff09;scheduleWithFixedDelaySingleThreadExecu…

synchronized的底层原理

目录 介绍 实现原理 对象头 Monitor&#xff08;监视器&#xff09; 锁升级 偏向锁 轻量级锁 重量级锁 锁的优缺点 介绍 synchronized 是 Java 中的关键字&#xff0c;它用于锁定代码块或方法&#xff0c;以确保同一时刻只有一个线程可以进入被锁定的部分。这在多线程…

企商在线亮相2024中国生成式AI大会,展出多元异构算力服务

4月18—19日&#xff0c;由知名媒体机构智东西与智猩猩共同主办的2024中国生成式AI大会在北京举行&#xff0c;55位重量级产学研投界代表同台分享。企商在线作为算力行业代表企业&#xff0c;参展生成式AI展区&#xff0c;现场展出企商在线AI算力平台及异构算力服务。 大会以“…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

网站&#xff1a;hhtp://www.uiotos.net 先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据…

四、Flask进阶

Flask-Cache pip install flask-caching安装flask_cache初始化 # ext.py from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_caching import Cachedb SQLAlchemy() migrate Migrate() cache Cache(config{CACHE_TYPE: simple # 缓存…

debian配置distcc分布式编译

前言 distcc 是一个用于在网络上的多台机器上分发 C、C、Objective C 或 Objective C 代码构建的程序。 distcc 应始终生成与本地构建相同的结果&#xff0c;易于安装和使用&#xff0c;并且通常比本地编译快得多。 distcc 不要求所有机器共享文件系统、同步时钟或安装相同的…

编写一款2D CAD/CAM软件(十四)绘制工具栏

前面的文章已经封装了数个最基本的图元&#xff0c;但是视图的呈现是基于测试数据形成的。为了尽快完善软件交互的框架和能力&#xff0c;本文将增加工具栏。 资源文件 1.首先&#xff0c;创建按钮图标。使用绘图软件构建出工具栏按钮的图标&#xff0c;绘图软件多种多样&…

使用 Rust 后,我​​使用 Python 的方式发生了变化

使用 Rust 后&#xff0c;我​​使用 Python 的方式发生了变化 Using type hints where possible, and sticking to the classic “make illegal state unrepresentable” principle. 尽可能使用类型提示&#xff0c;并坚持经典的“使非法状态不可表示”原则。 近年来&#xff…

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

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

决策大模型专题(一)

决策智能不应该停留在以前的思维中了&#xff0c;现在开一个专题来学习一下决策论坛的老师们的精彩的内容。本内容来自决策大模型论坛&#xff0c;张伟楠老师的内容整理。 决策大模型 是新一代人工智能的底层技术&#xff0c;它可以去赋能&#xff0c;智能体也就是AI agent&a…

C++进阶:map与set容器的使用

目录 1. 关联式容器map与set2. set与multiset的接口与使用2.1 set的接口与使用2.1.1 成员函数2.1.2 迭代器2.1.3 容量相关2.1.4 修改相关 2.1.5 查找&#xff0c;计数与补充2.2 multiset的接口与使用 3. map与multimap的接口与使用3.1 map的接口与使用3.1.1 map的使用补充3.1.2…

小孩子不懂事,写着玩的

目录 Web攻防 特有漏洞 ASP安全 ASPX&#xff08;.NET&#xff09;安全 PHP安全 JavaWeb安全 JS&#xff0c;Node.js安全 Java安全 Python安全 通用漏洞 SQL注入 MySQL-root高权限读写注入 PostgreSQL-高权限读写注入 MSSQL-sa高权限读写执行注入 SQL注入体系 o…

QWidget 类

QWidget 类中包括框架的属性 QWidget 类中不包括框架的属性 总结:可使用以下两种方法设置部件的位置和大小 ①、通常使用 move()设置部件的位置,使用 resize()设置部件的大小。 ②、使用 setGeometry()函数同时设置部件的位置和大小。 ③、无法为部件指定包含边框在内的大…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof&#xff08;类型&#xff09;强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

echarts bar图表实现多个label显示

2024.0.23今天我学习了使用bar组件&#xff0c;可以渲染多个label显示的效果&#xff0c;如&#xff1a; 当我们有一个这样的图表时&#xff0c;根据需求需要在 这上面的顶部再显示一个空置床位数占用床位数的合计总值&#xff0c;如果直接添加一个label肯定是不行&#xff0c;…

深度学习-线性代数

目录 标量向量矩阵特殊矩阵特征向量和特征值 标量由只有一个元素的张量表示将向量视为标量值组成的列表通过张量的索引来访问任一元素访问张量的长度只有一个轴的张量&#xff0c;形状只有一个元素通过指定两个分量m和n来创建一个形状为mn的矩阵矩阵的转置对称矩阵的转置逻辑运…