零基础学python之高级编程(3)---面向对象多态与封装(含有代码示例)

面向对象多态与封装

文章目录

  • 面向对象多态与封装
  • 前言
  • 一、多态
    • 方法重写(Overriding)
    • 方法重载(Overloading)
    • 抽象基类和接口(Abstract Base Classes and Interfaces)
  • 二、封装
      • 私有变量和私有方法
      • 属性装饰器(@property) 和 getter和setter方法
  • 总结


前言

大家好,上一篇文章我们详细的讲解了继承,今天我们来学习面向对象中的多态与封装,这三种特性,大家必须好好掌握,以后会经常用到.

一、多态

多态: 指的是事物有多种形态,是面向对象编程中的一个重要概念,它使得通过统一的接口可以调用不同类的对象,实现了代码的灵活性和可扩展性。

向不同的对象发送同一条信息(调用方法),不同对象在接收信息会产生不同的行为
(每个对象可以用自己的方式去响应函数)

方法重写(Overriding)

多态允许不同的对象对同一消息作出不同的响应。

示例代码:

class Animal:def make_sound(self):print'你好'class Dog(Animal):def make_sound(self):#相同的方法print("汪汪汪")class Cat(Animal):def make_sound(self):#相同的方法print("喵喵喵")animals = [Dog(), Cat()]# 同时实例化两个对象
for animal in animals:#迭代取出两个值animal.make_sound()

运行结果:
在这里插入图片描述
在上图我们看到了想昨天继承的一些方法,我们在子类定义的方法覆盖了父类的方法,这就是多态的一种表现形式---->方法重写

方法重载(Overloading)

方法重载(Overloading)是指在同一个类中定义多个方法,这些方法具有相同的名称但参数列表不同。方法重载的目的是为了提高代码的可读性和灵活性,使得程序员能够根据不同的需求选择合适的方法进行调用。

虽然在Python不支持方法重载,但是我们可以通过参数的默认值实现类似的效果。

示例代码:

class Calculator:def add(self, a, b, c=0):#给如c默认参数值return a + b + cc = Calculator()#实例化对象c
print(c.add(1, 2))      #传入参数a,b,c是默认参数值0
print(c.add(1, 2, 3))  #传入参数a,b,c,c默认值被覆盖

运行结果:
在这里插入图片描述

在方法重载中,方法的参数个数、类型或顺序可以不同,但方法的返回类型必须相同或是它的子类型。当调用一个重载方法时,编译器会根据传入的参数列表的类型和数量来确定应该调用哪个方法。

方法重载可以使代码更加简洁,避免使用多个不同的方法名称来执行类似但稍有不同的操作。它也提供了方法的统一接口,使得程序员能够更轻松地理解和使用代码。

抽象基类和接口(Abstract Base Classes and Interfaces)

Python的abc模块提供了抽象基类和接口的支持,可以定义规定子类必须实现的方法,并实现多态.

这里面应用到我们上篇内容讲解的抽象类.

示例代码:

from abc import ABC, abstractmethod #导入抽象模块class Shape(ABC):#定义定义抽象基类Shape@abstractmethod #用抽象类中装饰器定义抽象方法def area(self):#定义抽象方法areapassclass Rectangle(Shape): #定义功能子类 继承抽象基类Shapedef __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):# 定义功能子类  继承抽象基类Shapedef __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius * self.radiusshapes = [Rectangle(2, 3), Circle(4)]# 同时传参,进行实例化
for shape in shapes:# 循环遍历这个列表,列表中含有 实例化后对像print(shape.area())# 打印方法抽象area方法

运行结果:
在这里插入图片描述

我们可以看到抽象基类 Shape 提供了一个面积计算的接口,同时要求子类实现它。这样,我们可以确保所有的形状子类都有一个 area 方法,而且可以在主程序中通用地访问这个方法。


二、封装

封装: 将数据和方法进行隐藏和保护.隐藏对象的属性和实现细节,仅对外提供公开访问方式.

私有变量和私有方法

但是,这仅仅只是一种变形操作:

我们可以使用下划线作为变量或方法的前缀来表示它们是私有的。尽管Python没有严格的私有访问控制,但使用下划线作为前缀会告诉其他开发人员这些变量或方法是意图为私有的,应该避免直接访问。

类中所有双下划线开头的名字:__n会自动变形成_类名__n


这种变形的特点:

1.类中定义的__n只能在内部使用,内部使用的self.__n的形式实际上使用的是self._类名__n的结果

2.这种变形是针对外部的变形,在外部无法通过__n这个名字访问到

3.在子类定义的__n不会覆盖父类定义的__n.因为在子类中变形成了_子类名__n,父类中变形成了_父类名__n.所以双下划线的属性在继承给子类时,子类无法覆盖.

class MyClass:def __init__(self):self.__private_var = 10 #创建私有变量def __private_method(self): #定义私有方法print("This is a private method.")def public_method(self): #定义公共方法self.__private_var += 1 print("Private variable value:", self.__private_var)self.__private_method() # 在公共方法里面调用私有方法,在内部进行封装obj = MyClass()
obj.public_method()

运行结果:
在这里插入图片描述

class MyClass:def __private_method(self): #定义私有方法print("This is a private method.")def public_method(self): # 定义公共方法print("This is a public method.")self.__private_method() # 在公共方法的内部进行私有方法的调用,实现封装obj = MyClass()
obj.public_method() # 在调用公共方法的时候会间接调用私有方法

运行结果:

在这里插入图片描述

需要注意的是,尽管Python使用下划线作为私有标识符的约定,但它并不能真正实现私有性。仍然可以通过特定的方式访问或调用私有变量或方法,但这样做违反了代码的约定和最佳实践。

因此,应尽量遵守这种约定,将私有变量和方法视为类的内部实现细节,不建议直接访问或调用它们。

属性装饰器(@property) 和 getter和setter方法

property属性:

是一种特殊属性,访问它时会执行一段函数返回得到返回值

将一个类的函数定义成这个属性之后,对象再去使用对象名.属性名,无法察觉这个属性是执行函数后得到的.

面向对象中封装有三种方式:公开,保护,私有.python在语法中没有建立这种机制.在c++中一般会将数据设置成私有的,然后然后提供set和get方法去设置和获取,python是通过property属性实现的.

示例代码:

class Person:def __init__(self, name):self._name = name#将name属性封装成一个属性装饰器@property # 定义name 方法作为getter 方法def name(self):return self._name@name.setter # name.setter 装饰器定义了name方法作为setter方法def name(self, value):self._name = value@name.deleter # name.deleter 装饰器定义了name方法作为deleter方法def name(self):del self._name
# 通过property装饰器,我们可以向访问属性一样访问获取属性值
Person.name = '仁泽'
print(Person.name)

通过@property装饰器,我们可以像访问属性一样来获取属性值(例如:person.name)

通过@name.setter装饰器,我们可以像赋值属性一样来设置属性值(例如:person.name = “John”)

通过@name.deleter装饰器,我们可以删除属性值(例如:del person.name)

以上就property 的用法以及setter和 deleter的用法.

封装的好处:

可以隐藏内部实现细节,只对外提供必要的接口,从而保护数据的安全性和保证程序的稳定性。同时封装也使得代码更加模块化、可维护性更强,降低了代码的耦合度。


总结

现在我们学习完了面向对象编程的三种特性,接下来我会更新几个对于面向对象编程的实战案例.

讲的不好,多多见谅,我们下次再见!

更多优质文章点这里

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

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

相关文章

MySQL数据库-索引概念及其数据结构、覆盖索引与回表查询关联、超大分页解决思路

索引是帮助mysql高效获取数据的数据结构,主要用来提高检索的效率,降低数据库的IO成本(输入输出成本(Input-Output Cost)),同时通过索引对数据进行排序也能降低数据排序的成本,降低了CPU的消耗。 Mysql的默认存储引擎InnoDB,InnoDB采用的B树的…

算法刷题:盛水最多的容器

盛水最多的容器 .习题链接题目题目解析算法原理我的答案 . 习题链接 盛水最多的容器 题目 题目解析 VH*W h为左右两边低的一边,w为左右两边之间的距离 算法原理 定义两个指针 left0,rightn-1; left从左往右对数组进行遍历,right从右往左进行遍历 遍历的过程中,每一次都需要…

Web 扫描神器:Gobuster 保姆级教程(附链接)

一、介绍 Gobuster 是一款用于目录和文件枚举的开源工具。它主要用于在Web应用程序或网站上查找隐藏的目录和文件,从而进行信息收集或渗透测试。以下是 Gobuster 的一些主要特点和功能: 快速且高效: Gobuster 被设计为快速、高效的工具&…

3月第一批次❗教资认定流程简易版来啦

📝材料准备 1、身份证 2、户口本/学生证/居住证/毕业证 3、考试合格证明(免试人员需要师范生职业能力证书) 4、普通话证书 5、学历证书或认证报告 6、近期一寸白底证件照 7、有效期内体检报告 8、个人承诺书(网上签署) 网上申报 1、上传个人承诺书 2、校验普通话证书…

【图论】【树形dp】【深度优先搜索】2538. 最大价值和与最小价值和的差值

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 深度优先搜索 LeetCode2538. 最大价值和与最小价值和的差值 给你一个 n 个节点的无向无根图,节点编号为 0 到 n - 1 。给你一个整数 n 和一个长度为 n - 1 的二维整数…

算法沉淀——分治算法(leetcode真题剖析)

算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式,其核心思想是将一个大问题分解成若干个小问题&a…

去除vue自带的边距

使用vue时发现总有去不掉的外边距&#xff0c;在index.vue里面怎样设置样式都不管用 查阅资料后发现要在vue项目自带的index.html文件内添加下面的样式代码才行 <style>*{margin: 0;padding: 0;}body,html{margin: 0;padding: 0;} </style>

揭秘外观模式:简化复杂系统的关键设计策略

前言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它隐藏了系统的复杂性&#xff0c;并向客户端提供了一个可以访问系统的接口。这种类型的设计模式向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。这种模式涉及到一个单一的类…

全国计算机技术与软件专业技术资格(水平)考试软考中级高级报名步骤

第一步&#xff1a; 1、登陆全国的计算机网上报名平台 http://bm.ruankao.org.cn/sign/welcome 根据自己所在地区&#xff0c;选择报考城市入口&#xff08;例如&#xff1a;北京考区考生&#xff0c;直接选择北京就 可以&#xff09; 第二步&#xff1a;用户登录 1、已有…

数据湖的整体思路

湖本质上是一个集中化&#xff0c;中心化的&#xff0c;一体化的存储技术&#xff0c;并且在其之上追求技术架构的统一化&#xff0c;如流批一体&#xff0c;服务分析一体化。 当数据湖成为中心&#xff0c;那么就可以围湖而建“数据服务环”&#xff0c;环上的服务包括了数仓、…

微服务多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存…

【Docker】私有仓库

目录 1.搭建 2. 上传镜像 3.拉取镜像 1.搭建 1.拉取私有仓库的镜像 docker pull registry 2.创建私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry 3.打开浏览器,输入地址&#xff08;http:私有仓库服务器ip:5000/v2/_catalog&#xff09; 出现如图表示私…