零基础学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.mzph.cn/news/680562.shtml

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

相关文章

C++自动变量和static声明静态局部变量

C中的自动变量是指在函数内部声明的变量&#xff0c;其作用域仅限于该函数。这些变量会在程序执行到其所在的代码块时被创建&#xff0c;并在代码块执行结束后被销毁。 下面是一个示例 C 代码&#xff0c;展示了如何声明和输出自动变量和整型变量&#xff1a; #include <i…

AI绘画作品的展示和变现

AI绘画作品的展示和推广技巧 如何通过AI绘画打造独特的个人IP 4.1 AI绘画作品买卖 平台一&#xff1a;抖音 抖音平台有「抖音图文扶持计划」&#xff0c;还会不定期推出图文伙伴计划、图文热点来了等&#xff0c;大家起号的时候更容易 当你的每篇作品阅读量稳定在 1W 时&…

大话设计模式——1.模板方法模式(Template Method Pattern)

定义&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 例子&#xff1a;比较重大的考试往往有A、B两套试卷&#xff0c;其中一套出现问题可以立马更换另一套。 定义基…

字符串匹配之Z函数算法和KMP算法

目录 1 介绍1.1 Z函数算法2.2 KMP算法 2 训练 1 介绍 1.1 Z函数算法 Z函数算法&#xff0c;也叫作扩展KMP算法。它用来求取文本串text和模式串pattern的匹配位置。 首先介绍lcp(s1,s2)函数&#xff0c;它表示字符串s1和字符串s2的最大公共前缀长度。那么z[i] lcp(text, tex…

寒冰姐直播的一个开场加七个流程文字版(加强版)

寒冰姐直播开场版&#xff08;非常关键&#xff0c;让系统判定您在直播中&#xff09;&#xff1a; 大家在打开抖音直播后&#xff0c;3,2,1&#xff0c;开播就要说话&#xff0c;让抖音识别到你要开播&#xff0c;因为抖音有三大识别系统&#xff0c;文字识别系统、语音识别系…

2.12.。

1、选择芯片型号——STM32F051K8 2、开启调试功能 3、配置时钟 4、配置时钟树 5、工程管理

three.js 细一万倍教程 从入门到精通(一)

目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

海里定理例题

1. lim ⁡ x − > 0 s i n ( 1 x ) \lim\limits_{x ->0}sin(\frac{1}{x}) x−>0lim​sin(x1​)的极限不存在 取数列f(x), x n 1 2 n Π − Π 2 x_n\frac{1}{2nΠ-\frac{Π}{2}} xn​2nΠ−2Π​1​和 y n 1 2 n Π Π 2 y_n\frac{1}{2nΠ\frac{Π}{2}} yn​2nΠ2…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1&#xff09; Hive简介 Hive是Facebook实现的一个开源的数据仓库工具。将结构化的数据文件映射为数据库表&#xff0c;并提供HQL查询功能&#xff0c;将HQL语句转化为MapReduce任务运行 2&#xff09; Hive本质&#xff1a;将 HQL 转化成 MapReduce 程…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息删除实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【51单片机】串口通信实验(包括波特率如何计算)

目录 串口通信实验通信的基本概念串行通信与并行通信异步通信与同步通信单工、 半双工与全双工通信通信速率 51单片机串口介绍串口介绍串口通信简介串口相关寄存器串口工作方式方式0方式1方式 2 和方式 3 串口的使用方法&#xff08;计算波特率&#xff09; 硬件设计软件设计1、…

基于微信天津某健身房私教预约小程序系统设计与实现 研究背景和意义、国内外现状

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【前端高频面试题--虚拟DOM篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--虚拟DOM篇 虚拟DOM的理解虚拟DOM的解析过程为什么要用虚拟DOM虚拟DOM与真实DOM的…

类与结构体(6)

我们上一起讲了这一期讲存储类和继承&#xff0c;这个难度很大的。 存储类 存储类主要规定了函数和变量的范围&#xff0c;在c中有这些存储类↓&#xff1a; ৹ auto&#xff08;自动判断函数是什么类型&#xff09; ৹ register (常用的变量和inline差不多&#xff0c;但应…

【Vue】computed与watch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue⛺️稳重求进&#xff0c;晒太阳 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来新的属性&#xff0c;依赖的数据变化&#xff0c;自动重新计算 语法&#xff1a; 声明…

P1928 外星密码题解

题目 有了防护伞&#xff0c;并不能完全避免2012的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力&#xff0c;小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码&#xff0c;才能知道外星人给的准确回复。解开密码的第一道工序…

rbd快照管理、rbd快照克隆原理与实现、rbd镜像开机自动挂载、ceph文件系统、对象存储、配置对象存储客户端、访问Dashboard

目录 快照 快照克隆 开机自动挂载 ceph文件系统 使用MDS 对象存储 配置服务器端 配置客户端 访问Dashborad 快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态&#xff0c;可以恢复快照使用镜像、快照综合示例 #…

Rust结构体详解:定义、使用及方法

Rust 是一门强调安全性和性能的系统级编程语言&#xff0c;它引入了结构体&#xff08;struct&#xff09;作为一种自定义的数据类型&#xff0c;允许程序员以更加灵活的方式组织和操作数据。在本篇博客中&#xff0c;我们将深入探讨 Rust 结构体的定义、使用以及相关概念。 什…