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

news/2025/2/12 16:38:38/

封装

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.ppmy.cn/news/1420976.html

相关文章

记录Python链接mysql数据的增删改查方法

一、添加方法 db pymysql.connect(hostlocalhost,userroot,password123456,dbpython) cursor db.cursor() sql """insert into EMPLOYEEVALUES(3,张,天爱,35,F,8000) """ try:cursor.execute(sql)db.commit() #提交后,数据才会变 …

如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 若没有安装虚拟机的可以参考下篇文章进行安装: 博客链接https://eclecticism.blog.csdn.net/article/details/135713915 二、OpenEuler 镜像 点击链接前往官网 官网 选择第一个即可 三、安装 OpenEuler 打开虚拟机安装 Ctrl …

react项目中需要条形码功能,安装react-barcode使用时报错

react项目中需要条形码功能,用yarn add安装react-barcode后,在项目中使用import Barcode from ‘react-barcode’,页面中一直白屏,加载中 查看控制台报以下错误 load component failed Error: Module "./react-barcode"…

Linux: softirq 简介

文章目录 1. 前言2. softirq 实现2.1 softirq 初始化2.1.1 注册各类 softirq 处理接口2.1.2 创建 softirq 处理线程 2.2 softirq 的 触发 和 处理2.1.1 softirq 触发2.1.2 softirq 处理2.1.2.1 在 中断上下文 处理 softirq2.1.2.2 在 ksoftirqd 内核线程上下文 处理 softirq 3.…

HCIA--综合实验(超详细)

要求: 1. 使用172.16.0.0/16划分网络 2.使用ospf协议合理规划区域保证更新安全 3.加快收敛速度 4. r1为DR没有BDR 5.PC2,3,4,5自动获取IP地址;PC1为外网,PC要求可用互相访问 6.r7为运营商,只能配…

Android retrofit

目录 一.简介 二.基本使用 三.注解 四.转换器 五.适配器 六.文件上传与下载 一.简介 A type-safe HTTP client for Android and Java。封装了OkHttp,也是由Square公司贡献的一个处理网络请求的开源项目。 square/retrofit: A type-safe HTTP client for Andr…

Qt创建基于应用程序的插件

应用程序插件 什么是插件插件的好处插件的种类应用程序插件创建应用程序的插件步骤:创建测试插件的应用程序步骤:应用程序插件示例开发环境创建示例生成插件运行结果总结什么是插件 插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。 插件的…

Composer安装与配置详解

目录 第一章:Composer简介 1.1 什么是Composer? 1.2 Composer与传统的依赖管理工具的区别 1.3 Composer的发展历程 1.4 本章小结 第二章:Composer安装 2.1 全局安装与项目内安装 2.1.1 全局安装 安装步骤 2.1.2 项目内安装 安装步骤 2.2 不同操作系统下的安装方…