《0基础》学习Python——第十四讲__封装、继承、多态

<封装、继承、多态>

一、类和实例解析

        1、面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板 ,比如Student类,而 实例是根据类创建出来的一个个具体的“对象” ,每个对象都拥有相同的方法,但各自的数据可能不同。
        2、用class 类名即可以创建一个类,类名通常是大写开头的单词

3、 定义好了Student类,就通过类名+()创建出Student的实例,可以自由地给一个实例变量绑定属性

        4、由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去:

        5、__init__前后分别有两个下划线,__init__方法的第一个参数永远是self,表示创建的实例本身,有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,self不需要传,Python解释器自己会把实例变量传进去

二、数据封装

        数据封装是面向对象编程中的一个概念,它指的是将数据和操作数据的方法封装成一个对象。数据封装的目的是保护数据的安全性和完整性,通过使用类和访问控制方式来限制数据的访问和修改。

        要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用时只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入。

        封装的另一个好处是可以给Student类增加新的方法,比如get_grade:

        同样的,get_grade方法可以直接在实例变量上调用,不需要知道内部实现细节

class Student:def __init__(self, name, age):self.__name = nameself.__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 = ageif __name__ == '__main__':    student = Student("Tom", 18)name = student.get_name()age = student.get_age()# 输出学生的信息print("姓名:", name)print("年龄:", age)

在上面的代码中Student封装了学生的姓名和年龄数据,并提供了对应的访问和修改方法get_name()set_name()get_age()set_age()。在类的__init__方法中,我们使用双下划线__来表示私有属性,即外部无法直接访问的属性。通过使用封装的方法来间接访问和修改对象的数据,从而保护了数据的安全性和完整性。同样,其他类或模块无法直接访问和修改私有属性。

注意:Python中的封装是通过约定而不是强制来实现的。私有属性和方法的命名规范是使用双下划线__作为前缀,但实际上仍然可以直接访问和修改,只是不推荐这样做。这是因为在Python中,尊重开发者的自由和责任,更加注重一种约定俗成的编程规范。

三、继承

        在Python中,继承是面向对象编程中的一个重要概念,它允许一个类(称为子类)继承另一个类(称为父类或基类)的属性和方法。子类可以通过继承来获得父类的所有特性,并可以在此基础上添加自己独有的属性和方法。

继承的语法如下:

class 子类名(父类名):pass

        在这个示例中,子类名是子类的类名,父类名是要继承的父类的类名。使用关键字class定义子类后,可以在类体中添加自己的属性和方法,或者覆盖父类的方法。

例如:

# 定义一个父类
class Animal:def __init__(self, name):self.name = namedef eat(self):print(f"{self.name} is eating.")# 定义一个子类,继承自父类
class Dog(Animal):def bark(self):print(f"{self.name} is barking.")if __name__ == '__main__':# 创建一个Dog实例dog = Dog("Buddy")# 调用继承自父类的方法dog.eat()# 调用子类自己的方法dog.bark()

在上面的代码中,Animal类是父类Dog类是子类。子类Dog继承了父类Animal属性和方法。通过创建Dog类的实例dog,我们可以调用继承自父类的方法eat(),还可以调用子类自己的方法bark()

四、继承几个重要的特点

        1、子类可以继承父类的属性和方法,包括公有属性和方法。

        2、子类可以覆盖父类的方法,即重新实现父类的方法。

        3、子类可以添加独有的属性和方法。

        4、子类可以继续被其他类继承,形成多层继承关系。

        继承是面向对象编程中实现代码重用和逻辑组织的重要方式,可以提高代码的可读性和可维护性。同时,继承也符合面向对象编程的开放封闭原则,使得程序的扩展和修改更加灵活和易于实现。

五、多态

        1、多态(Polymorphism)是指对象可以在不同的上下文中以不同的方式呈现。具体来说,多态指的是同一操作对不同对象的操作会产生不同的结果。

        2、多态实现基本机制方法重写(Method Overriding)方法重载(Method Overloading)。  

        3、方法重写指的是在子类中重新定义父类中已经存在的方法,以便在子类的对象上调用该方法时执行子类中的实现。通过方法重写,子类可以覆盖继承自父类的方法,并且在执行时会根据对象的类型选择适当的方法。

        4、方法重载指的是在同一个类中定义具有相同名字参数个数或类型不同的多个方法。在调用该方法时,编译器会根据传入的参数的类型和数量选择合适的方法执行。

class Animal:def sound(self):passclass Dog(Animal):def sound(self):print("Dog is barking.")class Cat(Animal):def sound(self):print("Cat is meowing.")# 定义一个多态的方法,接受Animal对象作为参数
def make_sound(animal):animal.sound()if __name__ =="__main__":# 创建不同的子类实例    dog = Dog()cat = Cat()# 调用多态的方法,分别传入不同的子类实例make_sound(dog)make_sound(cat)

        在上面的代码中,Animal类是父类,Dog类和Cat类是子类。父类中的sound()方法被子类重写,分别实现了不同的行为。通过创建不同的子类对象并调用多态的方法make_sound(),可以看到不同的子类对象调用相同的方法会产生不同的结果。

六、猴子补丁

        猴子补丁(Monkey patching)是指在运行时动态修改拓展已有的类函数模块的行为,而无需对它们进行显式的继承或修改源代码。在Python中,由于语言的动态特性,我们可以使用猴子补丁来改变已有对象的行为添加新的方法

        猴子补丁的概念源于猴子可以在树上动态改变环境,类比于我们可以在运行时动态改变代码。

# 定义一个原始的类
class Foo:def bar(self):print("Original bar")if __name__ == '__main__':# 创建一个原始类的实例foo = Foo()# 定义一个新的方法
def new_bar(self):print("New bar")if __name__ == '__main__':# 将新的方法绑定到原始类上Foo.bar = new_bar# 调用原始类的方法,实际上调用了被修改后的方法foo.bar()  # 输出:New bar

        在上面的代码中,我们首先定义了一个原始的类 Foo,其包含一个方法 bar然后创建了 Foo 的一个实例 foo。接下来,我们定义了一个新的方法 new_bar。最后,通过将新的方法 new_bar 绑定到原始类 Foo 的 bar 方法上,从而实现了对原始类的修改。当调用foo.bar()时,实际上会调用被修改后方法 new_bar

注意:猴子补丁虽然在某些情况下可以非常方便,但它也可能导致代码变得难以理解和维护。因此,在使用猴子补丁时,应该确保清楚地理解其影响和潜在的风险,并尽量避免过度使用。

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

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

相关文章

day2 上下文Context

文章目录 使用效果设计Context路由(Router)框架入口 本文代码地址&#xff1a;day2 上下文Context 本文是 7天用Go从零实现Web框架Gee教程系列的第二篇。 主要内容如下&#xff1a; 将路由(router)独立出来&#xff0c;方便之后增强。设计上下文(Context)&#xff0c;封装 R…

04.阻塞赋值和非阻塞赋值

1.阻塞赋值 阻塞赋值的赋值号是用""表示,对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系.它的操作结构可以认为是只有一个步骤的操作,即计算赋号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他verilog语句的干扰,直到现行的赋值完成,才…

释放Conda通道束缚:启用自由通道恢复的终极指南

释放Conda通道束缚&#xff1a;启用自由通道恢复的终极指南 在Conda的生态中&#xff0c;通道&#xff08;channels&#xff09;是包来源的路径&#xff0c;而自由通道&#xff08;free channel&#xff09;通常指的是非限制性的包源&#xff0c;可以提供更多的包选择。有时&a…

《昇思25天学习打卡营第23天|onereal》

第23天学习内容简介&#xff1a; ----------------------------------------------------------------------------- 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 配置网络线路 2 代码开发 下载权重大约需要10分钟 ------------------------------- 运…

大模型技术对学校有什么作用?

大模型技术对学校有多方面的作用&#xff0c;可以在教学、管理、决策等多个领域带来显著的改进。以下是大模型技术对学校的主要作用&#xff1a; 1. 个性化教学&#xff1a;大模型技术可以帮助教师分析学生的学习行为和历史成绩&#xff0c;从而定制个性化的教学计划和资源。这…

告别自动激活:掌握如何在Conda中禁用Base环境

告别自动激活&#xff1a;掌握如何在Conda中禁用Base环境 引言 在Python开发的世界中&#xff0c;环境管理是一个不可或缺的部分。Conda是一个强大的包管理器和环境管理器&#xff0c;它允许开发者为不同的项目创建隔离的环境&#xff0c;从而避免依赖冲突。默认情况下&#…

maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网

一.背景 公司主机管理组的兄弟安装了1Panel(社区版v1.10.10-lts)&#xff0c;期望我们开发的小项目都通过docker来部署。我第一步要配置的就是怎么将docker镜像构建能力共享的问题&#xff0c;因为我本机是windows&#xff0c;不想再去折腾安装docker环境。 二.设置过程 个人…

ES6 对象的新增方法(十四)

1. Object.assign(target, …sources) 特性&#xff1a;将一个或多个源对象的所有可枚举属性复制到目标对象。 用法&#xff1a;用于对象属性的合并。 const obj1 { a: 1, b: 2 }; const obj2 { b: 3, c: 4 }; Object.assign(obj1, obj2);console.log(obj1); // 输出&#…

Linux桌面环境手动编译安装librime、librime-lua以及ibus-rime,提升中文输入法体验

Linux上的输入法有很多&#xff0c;大体都使用了Fcitx或者iBus作为输入法的引擎。相当于有了一个很不错的“地基”&#xff0c;你可以在这个“地基”上盖上自己的“小别墅”。而rime输入法&#xff0c;就是一个“毛坯别墅”&#xff0c;你可以在rime的基础上&#xff0c;再装修…

网络安全-网络安全及其防护措施4

16.网络故障排除 网络故障排除的定义和作用 网络故障排除是检测、诊断和解决网络问题的过程。通过系统的方法&#xff0c;确保网络的稳定性和可用性&#xff0c;减少故障对业务的影响。有效的网络故障排除可以减少停机时间&#xff0c;提高网络的可靠性和性能&#xff0c;确保…

HCNA ICMP:因特网控制消息协议

ICMP&#xff1a;因特网控制消息协议 前言 Internet控制报文协议ICMP是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制信息&#xff0c;他对于手机各种网络信息、诊断和排除各种网络故障有至关重要的作用。使用基于ICMP的应用时&#xff0c;需要对ICMP的工…

Apollo docker-compose

来源 https://www.apolloconfig.com/#/zh/deployment/quick-start-docker 路径 /usr/apollo Sql 自己复制 Vim docker-compose.yml #如果安装过了 记得删除mysql 历史文件 rm -r /var/lib/mysql version: 2.1services:apollo-quick-start:image: nobodyiam/apollo-quick…

AWS CDN新增用户ip 地区 城市 响应头

1.需要自定义cdn缓存策略 这里的策略也是先复制之前的cdn策略哈 最后复制完了 全部新增这两条标头key CloudFront-Viewer-Country CloudFront-Viewer-City 2.然后新增cdn函数&#xff0c;应用你写的这个函数 function handler(event) {var request event.request;var respon…

【grpc】内容回顾

建议先看官网了解概念&#xff0c;点击跳转到官网 proto约束文件介绍 命令 message关键字 相当于golang里的结构体 字段规则 repeated:代表切片等可重复类型 options&#xff1a;其他默认是options 消息号 message中每个字段必须有一个唯一标识号 服务定义 rpc 服务函…

python 语法学习 day9

一.编程题错题反思 1.删除列表中的奇数(易错题) num input().split() flag 0 for i in range(len(num)): num[i] int(num[i]) for i in range(len(num)): if flag ! 0: i - flag if num[i] % 2 ! 0: num.remove(num[i]) flag 1 pr…

PySide(PyQt),csv文件的显示

1、正常显示csv文件 import sys import csv from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QWidgetclass CSVTableWidgetDemo(QMainWindow):def __init__(self):super().__init__()# 创建显示控件self.widget QWidget(self)sel…

在SpringCloud中实现服务监控与告警的业务指标监控

在Spring Cloud中&#xff0c;可以使用一些工具和框架来实现服务监控与告警的业务指标监控。本文将介绍一种常用的方案&#xff0c;使用Prometheus和Grafana来实现监控指标的采集和展示&#xff0c;并结合Alertmanager实现告警功能。 Prometheus简介 Prometheus是一款开源的监控…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如&#xff0c;线性意味着单调假设&#xff1a; 任何特征的增大都会导致模型输出的增大&#xff08;如果对应的权重为正&#xff09;&#xff0c; 或者导致模型输出的减小&#xff08;如果对应的权重为负&#xff09;。 有时这是有道理的。 例…

ENSP防火墙NAT智能选举综合实验

实验目的及其拓扑图&#xff1a; 创建我的拓扑&#xff1a; 新建修改配置fw1上的nat策略和安全策略&#xff1a; pc2ping1.1.1.1测试结果&#xff1a; 服务器映射配置&#xff1a; 配置对应安全策略&#xff1a; 配置fw2&#xff0c;子公司的NAT策略&#xff1a; 配置全局选路路…

代码随想三刷图论篇2

代码随想三刷图论篇2 104. 建造最大岛屿题目代码 110. 字符串接龙题目代码 105. 有向图的完全可达性题目代码 106. 岛屿的周长题目代码 104. 建造最大岛屿 题目 链接 代码 import java.util.*; class Main{public static void main(String[] args){Scanner sc new Scanner…