python 面向对象(封装、继承、多态)

封装

1 封装概述    

 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

2 封装原则

 将不需要对外提供的内容都隐藏起来      把属性隐藏,提供公共方法对其访问。

3 封装好处      

隐藏实现细节,提供公共的访问方式      提高了代码的复用性      提高安全性。

4 代码部分

定义Person类

class Person():def __init__(self,id,name):self.id=idself.name=namedef print_info(self):print('%d %s' % (self.id,self.name))alex=Person(1,'alex')
alex.print_info()
xiao=Person(2,'xiaoming')
xiao.print_info()

在class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

继承

介绍

对于若干个相同或者相识的类,我们可以抽象出他们共有的行为或者属性并将其定义成一个父类,然后用这些类继承该父类。

通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类。

子类不仅可以拥有父类的属性、方法还可以定义自己独有的属性或者方法。

继承的语法

class 类名(父类名):pass

特点 

1. 子类继承父类中的非私有化的属性和方法;

2. 子类继承自父类,可直接享受父类已封装好的方法,不需再次开发;

3. 子类中应根据职责,封装子类特有的属性和方法。

4. 如果在类定义中未指定基类,则默认其基类为object:

class Person:pass等同于:class Person(object):pass注:object是所有对象的根基类

在Python中,object 是所有类的基类。如果在类定义中未指定基类,Python会默认将其基类设置为object类。object类是Python中所有类的根类,它定义了所有Python类共有的基本行为,如对象的创建和销毁、属性访问、比较操作等。
因此,即使在类定义中未显式指定基类,在Python中定义的每个类都会隐式继承自object类,从而获得object类提供的默认行为。这种默认继承关系确保了Python中类的一致性和统一性,使得所有的类都能够共享基本的对象模型和行为。

代码部分

定义Person类、Student类

class Person():def __init__(self,id,name):self.id=idself.name=namedef print_info(self):print('%d %s' % (self.id,self.name))class Student(Person):def __init__(self,id,name,sno):Person.__init__(self,id,name)self.sno=snodef print_info(self):Person.print_info(self)print('我的学号是:',self.sno)p1=Person(1,'张三')
p1.print_info()
s1=Student(2,'王五',150001)
s1.print_info()

重写

当父类方法的实现不能满足子类需求时,可对方法进行重写。        

重写父类方法有两种情况:                    

1.覆盖父类的方法。                

2.子类对父类进行扩展。

覆盖

即在子类中定义一个同父类同名的方法且实现重写之后,在运行时,只会调用子类中重写的方法,而不再调用父类封装的方法。

class Student(Person):def __init__(self,id,name,sno):Person.__init__(self,id,name)self.sno=snodef print_info(self):print('我是一名学生,我的学号是:',self.sno)s1=Student(2,‘王',150001)
s1.print_info()

扩展

父类原本封装的方法实现是子类方法的一部分

具体实现步骤:    

1.在子类中重写父类的方法    

2.在需要调用父类方法时用:父类名.父类方法或super().父类方法    

3.代码其他的位置针对子类需求,编写子类特有的代码

class Student(Person):def __init__(self,id,name,sno):Person.__init__(self,id,name)self.sno=snodef print_info(self):super().print_info()print('我的学号是:',self.sno)s1=Student(2,‘王',150001)
s1.print_info()

父类的私有属性和私有方法

子类不能在自己的方法内部,直接访问父类的私有属性和方法;

子类对象不能直接访问父类的私有属性和方法,可通过父类公有方法间接访问到私有属性和方法。

class Person():def __init__(self):self.p='公开'self.__s='秘密'def __test(self):print('私有方法%s %s' % (self.p,self.__s))class Student(Person):def fun(self):print(self.p)# print(self.__s) # 出错# self.__test() # 出错# 子类不能在自己方法内部,直接访问父类的私有属性和方法
# 子类对象
s1=Student()
s1.fun()
# s1.__test()  出错
# print(s1.__s) 出错
# 子类对象不能直接访问父类的私有属性和方法

多继承

继承多个父类。

语法

class 类名(父类名1,父类名2……):pass

代码部分

class A:def test(self):print('test方法')
class B:def demo(self):print('demo方法')class C(A,B):passc=C()
c.test()
c.demo()

多态

不同的子类对象调用相同的父类方法,产生不同的执行结果。换句话说,通过多态性,可以使用统一的接口来调用不同类的方法,而具体执行的方法取决于对象的实际类型。

例如,假设有一个Shape基类和它的子类CircleRectangle,它们都实现了calculate_area()方法。使用多态性,可以编写一个统一的函数来计算不同形状的面积,而不需要关心具体是哪种形状:

class Shape:def calculate_area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef calculate_area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef calculate_area(self):return self.width * self.heightdef print_area(shape):print("Area:", shape.calculate_area())circle = Circle(5)
rectangle = Rectangle(4, 6)print_area(circle)  # 输出:Area: 78.5
print_area(rectangle)  # 输出:Area: 24

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

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

相关文章

目标检测——YOLO系列学习(一)YOLOv1

YOLO可以说是单阶段的目标检测方法的集大成之作,必学的经典论文,从准备面试的角度来学习一下yolo系列。 YOLOv1 1.RCNN系列回顾 RCNN系列,无论哪种算法,核心思路都是Region Proposal(定位) classifier&am…

链表拓展之双向链表

前言 在前面已经总结了单链表,有了单链表的基础会很好理解双链表的实现,忘记了可以跳转——>http://t.csdnimg.cn/GFPk9 接下来就由我带着各位看官来认识今天的主角吧~ 什么是双向链表 在单链表的基础上,它有两个方向的链接,一…

Java -- (part10)

一.继承 1.概述 子类继承父类,可以直接使用父类中非私有成员,子类不用写重复代码,提高了代码的复用性 2.关键字 extends 3.成员访问特点 a.成员变量 看等号左边是谁,先调用谁中的成员变量,子类没有找父类 b.成员方法 看new的是谁,先调用谁中的成员方法,子类没有找父类 …

第二期书生浦语大模型训练营第五次笔记

模型部署 模型部署对于任何大模型来说是非常关键的一步。一旦模型经过训练并达到预期的性能指标,就需要将其部署到实际的生产环境中,为最终用户提供服务。但是在部署过程中,大型模型会面临一些独特的挑战。 面临的挑战 大模型在部署方面有一个难题,就是大模型的“大…

网页基本结构

目录 网页基本介绍 网站 网页 网页的组成 浏览器 常见的浏览器 浏览器内核 Web标准 Web标准的构成 网页基本介绍 网站 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合 网页 网页是网站中的一“页”,通…

fatal: Out of memory, malloc failed

git 切分支,或者clone仓库的时候碰到这个错误,看网上很多配置config文件,都尝试了没效果。 自测了一个可行的方式: 由于本人用的sourcetree 所以解决方式如下: git升级为最新版,选择系统GIt版本&#xf…

加强金融行业关键信息基础设施安全保护,有效防范网络安全风险

当前,随着数字化发展的不断深入,关键信息基础设施作为国家的重要战略资源,面临着国内外严峻的网络安全风险。为了确保国家安全,在国家发展各领域和全过程中,需要将安全发展贯穿始终,筑牢国家安全屏障。金融…

打一把王者的时间,学会web页面测试方法与测试用例编写

一、输入框 1、字符型输入框: (1)字符型输入框:英文全角、英文半角、数字、空或者空格、特殊字符“~!#¥%……&*?[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时,…

C#-特性的定义及使用

自定义特性(Attribute) 1.自定义特性 全继承自Attribute基类(使用前要给自定义特性赋予相关特性) [AttributeUsage(AtrributeTargets.Class|AttributeTargets.Method,AllowMultipletrue,Inheritedtrue)//AttributeTargets.Class:允许放类上//AllowMu…

【Altium Designer 20 笔记】PCB铺铜过程

PCB铺铜步骤 切换到Keep-Out Layer(禁止布线层) 使用shifts键切换单层显示 画禁止布线范围(防止铺铜过大) 切换到需要铺铜的层 选择铺铜网络,通常是地(GND)或某个电源网络 隐藏覆铜:…

SpringBoot项目接入Nacos注册中心

前置 已经安装好Nacos服务,并且该项目所在服务器可以访问到 可以参考下: windows环境安装Nacos单机版-CSDN博客 Centos7安装Nacos单机版-CSDN博客 1. POM文件引入依赖 注意,父工程已经引入spring cloud依赖管理的情况下不用添加版本号 …

CAN网络管理(网络节点)

什么是CAN的网络节点 网络节点是指连接到CAN总线上的设备或模块,每个网络节点都具有唯一的标识符,称为节点ID,用于在CAN总线上进行通信和识别。 如何判断CAN的网络节点是多少 可以根据DBC来定义查看, 以ADCU为例,域控作为主节点,一般外部的像雷达,camera的数据都是向…

使用 create-vue 脚手架工具创建一个基于 Vite 的项目,并包含加入 Vue Router 等可选项

如果你打算启动一个新项目,你可能会发现使用 create-vue 这个脚手架工具更容易,它能创建一个基于 Vite 的项目,并包含加入 Vue Router 的选项,指令如下: // npm npm create vuelatest// yarn yarn create vue// pnpm …

Postman 环境变量配置初始调用登录脚本赋值Token

效果 新建环境 切换 Environments 标签下 点击上面加号增加环境变量 使用环境变量 使用{{变量名}}引用变量使用 Pre-request Script 全局 一般授权接口都需要再调用接口前,进行登录授权,这里使用了全局的请求前脚本调用。 脚本示例 // 基础地址 var…

Jenkins上面使用pnpm打包

问题 前端也想用Jenkins的CI/CD工作流。 步骤 Jenkins安装NodeJS插件 安装完成,记得重启Jenkins。 全局配置nodejs Jenksinfile pipeline {agent anytools {nodejs "18.15.0"}stages {stage(Check tool version) {steps {sh node -vnpm -vnpm config…

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 …

每日一题:C语言经典例题之百文买百鸡(增加无解输出)

题目描述 公鸡五文钱一只,母鸡三文钱一只,小鸡一文钱三只,用m文钱买m只鸡,公鸡、母鸡、小鸡各买多少只? 输入 一个正整数m。 输出 若有解只输出一个解,即公鸡数量最少的那个解;若无解输出“No a…

Vue router 与 route 的区别

在Vue Router中,router和route是两个不同的概念,它们各自具有不同的作用和功能。 router (路由实例) router是Vue Router的实例,它是整个路由系统的核心。 router负责创建和管理路由映射关系,即URL路径与…

基于SSM的游戏攻略管理系统

游戏攻略管理系统的构建与实现 一、系统概述二、系统架构与技术选型三、系统功能模块四、系统特点五、总结与展望 随着网络游戏的普及和发展,游戏攻略成为玩家们提升游戏技能、了解游戏机制的重要途径。为了更好地满足玩家需求,提高游戏攻略的管理效率和…

C 内存管理

C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中&#xff0c;内存是通过指针变量来管理的。指针是一个变量&#xff0c;它存储了一个内存地址&#xff0c;这个内存地址可以指向任何数据类型的变量&#xff0c;包括整数、…