零基础学python之高级编程(2)---面向对象编程组合用法及其继承特性

news2024/11/25 1:07:24

面向对象编程组合用法及其继承特性

文章目录

  • 面向对象编程组合用法及其继承特性
  • 前言
  • 一、面向对象编程组合用法
    • 1 直接在类中创建实例化对象
    • 2 给入参数,在结尾给一个类实例化传参变成对象,然后再在另一个类中传入对象参数
  • 二、面向对象编程----继承
    • 1.继承定义
      • (1) 单继承
      • (2)多继承
    • 2.抽象和继承关系
    • 3.派生(方法重写)
      • 调用父类方法
      • 子类继承父类之后重写__init__方法
    • 4.抽象类的使用
    • 5.多继承的继承顺序
  • 总结


前言

大家好,我们上次学习了面向对象编程中类的创建,我们知道如何去创建一个类,并且能够调用类中的方法.查看类中的属性,今天我们就增加一些难度学习面向对象编程的组合用法.并且学习面向对象编程三特性之一的—>继承

一、面向对象编程组合用法

首先,我们要想在面向对象编程的代码中实现重复利用,我们就要用到组合用法

我们先来看一个示例:

1 直接在类中创建实例化对象

#如果我们有两种类,如何实现组合调用
class Weapon:#定义一个Weapon类
	def __init__(self,name):#给如参数name
    self.name = name

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        # 在类的内部进行实例化得到另一个类的对象
        self.weapon = Weapon('棍子') #初始化weapon属性中直接将Weapon类实例化

p = Person('张三',28)#实例化Person类
print(p.weapon.name)#调用Person类中的Weapon对象传入的'棍子',所以我们得到的结果一定是棍子,我们就在另一个类中组合运用了其他类的属性.


#查看类中属性需要用print来查看
#查看类中方法需要先实例化,再进行调用

运行结果:

在这里插入图片描述

2 给入参数,在结尾给一个类实例化传参变成对象,然后再在另一个类中传入对象参数

示例代码:

class Weapon:
    def __init__(self,name):
        self.name = name
class Person:
    def __init__(self,name,age,weapon):#给如weapon参数
        self.name = name
        self.age = age
        # 在类的内部进行实例化得到另一个类的对象
        # self.weapon = Weapon('棍子') #初始化weapon属性中直接将Weapon类实例化
        self.weapon = weapon #初始化weapon参数
w = Weapon('枪') #将类实例化后变成对象
p = Person('仁泽',19,w)给Person类传入参数,将Weapon实例化后的对象传入也可以实现调用
print(p.weapon.name)

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

当类和类之间有显著的不同,并且较小的类是较大的类所需要的组建时,可以用组合的用法实现代码的重复利用.


二、面向对象编程----继承

1.继承定义

在python中,可以通过继承,让一个类使用另一个类的全部属性.

继承: 新建的类可以继承一个父类或者多个父类的属性,新建的类称为子类.

父类和子类就像爸爸和儿子一样,儿子继承爸爸的全部属性

(1) 单继承

语法:

class Dad:#父类
	pass
class Son1(Dad):
	pass
class Son2(Dad)
	pass

(2)多继承

语法:

class Dad1:#父类1
	pass
class Dad2:#父类2
	pass
class son(Dad1,Dad2): #子类,同时继承两个父类的所有属性
	pass
	

2.抽象和继承关系

抽象

1.将对象比较像的部分抽取成类
2.将类比较像的部分抽取成父类

继承:是基于抽象的结果,通过编程语言去实现,先经历过抽象,才能通过继承的方式去表达抽象的结构

用已经有的类创建一个新的类,这样就重用了已经有的代码中的一部分.

3.派生(方法重写)

方法重写: 子类可以重写(覆盖)父类的方法,以改变方法的行为。

示例代码:

class Parent:
    def say_hello(self):
        print("Hello from Parent")

class Child(Parent):
    def say_hello(self):
        print("Hello from Child")

child = Child()
child.say_hello()

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

在这里面我们使用子类重新写了say_hello 的方法,对父类的方法进行了覆盖,所以结果是子类我们修改后的结果。

  • 1.直接在子类中定义新的属性
  • 2.在子类中,新建的重名的函数属性,那么调用新增的属性时,是以自己的为准
  • 3.但是可能需要用到父类中重名的那个函数功能

调用父类方法

语法:
1 super()

class Parent:
    def say_hello(self):
        print("Hello from Parent")

class Child(Parent):
    def say_hello(self):
        super().say_hello()# super()调用父类中的say_hello方法
        print("Hello from Child")

child = Child()
child.say_hello()

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

2 在子类中使用父类名.方法名(self)调用父类方法,self也需要传参

代码示例:

class Parent:
    def say_hello(self):
        print("Hello from Parent")

class Child(Parent):
    def say_hello(self):
        Parent.say_hello(self)#在子类中使用父类名.方法名(self)调用父类方法,self也需要传参
        print("Hello from Child")

child = Child()
child.say_hello()

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

子类继承父类之后重写__init__方法

示例代码:

class Animal:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print('%s吃' % self.name)

    def drink(self):
        print('%s喝' % self.name)

class Cat(Animal):
    def __init__(self, name, breed):#传入新的属性breed
        super().__init__(name)  # 执行父类Animal中的__init__方法,传入父类参数,没有self
        self.breed = breed  # 派生新的属性




class Parent:
    def __init__(self, name):
        self.name = name

class Child(Parent):
    def __init__(self, name, age):#传入新的属性age
        super().__init__(name)  # 使用super()调用父类的初始化方法
        self.age = age

    def print_info(self):
        print("Name:", self.name)
        print("Age:", self.age)

child = Child("Alice", 10)
child.print_info()

以上就是在子类中重写__init__的方法


4.抽象类的使用

抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类提供了一种将相关的类组织在一起的机制,它定义了一个接口或者一组方法,供子类实现。抽象类一般用作父类,通过定义抽象方法来规范子类的行为,子类必须实现这些抽象方法才能被实例化。

抽象类的主要作用有以下几个方面:

提供了一种约束机制:通过定义抽象方法,抽象类可以规范子类的行为,强制子类实现一些特定的方法。这样可以确保子类具有特定的行为或功能,提高了代码的可读性和可维护性。

作为接口的替代方案:Python中没有像Java等语言中的接口概念,但通过抽象类可以模拟接口的功能。通过定义抽象方法,可以实现多态特性,让不同的子类有不同的实现方式。

提供了一种多继承的方式:Python支持多继承,一个类可以同时继承多个父类。通过继承抽象类,子类可以获得多个父类的属性和方法,实现了代码复用和多态特性。

总之,抽象类提供了一种规范和约束子类行为的机制,同时也提供了代码复用和多态的功能。在实际开发中,抽象类常常用作父类,通过继承和重写来实现具体的业务逻辑

import abc
class File(metaclass=abc.ABCMeta):
    @abc.abstractmethod  # 定义抽象方法,无需实现功能
    def read(self):  #控制子类必须实现这个方法
        print('必须实现我')

    @abc.abstractmethod
    def write(self):
        pass

class Txt(File):
    def read(self):
        print('文本文件读')

    def write(self):
        print('文本文件写')

5.多继承的继承顺序

python会自动计算一个mro列表,里面就存放着所有父类的继承顺序.

遵循的规则:

  • 1.子类先于父类被查找
  • 2.如果这个类存在多个合法的选择,会从左到右选择
  • 3.多个父类则根据列表中的顺序被检查

总结

今天我们详细的讲解了面向对象的两种组合用法,以及面向对象三特性之一继承的重要知识点,希望大家多多练习,按照本文示例代码敲写一遍

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

更多优质文章点这里

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

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

相关文章

浅谈人工智能之深度学习~

目录 前言:深度学习的进展 一:深度学习的基本原理和算法 二:深度学习的应用实例 三:深度学习的挑战和未来发展方向 四:深度学习与机器学习的关系 五:深度学习与人类的智能交互 悟已往之不谏&#xff0…

2023年智能可穿戴行业市场分析(电商数据查询分析):智能手表销额增长21%,手环明显下滑

近年来,随着技术的进步,智能可穿戴设备在社交网络、医疗保健、导航等诸多领域有着非常广泛的应用,这为大众生活带来了诸多便利。 当前的可穿戴产品形态纷繁多样,主要包括智能手表、智能眼镜、智能手环、健康穿戴和体感控制等等&am…

Unity学习笔记(零基础到就业)|Chapter02:C#基础

Unity学习笔记(零基础到就业)|Chapter02:C#基础 前言一、复杂数据(变量)类型part01:枚举数组1.特点2.枚举(1)基本概念(2)申明枚举变量(3&#xff…

生态位模拟——草稿笔记

文章目录 前言ENM初识一、所需软件安装1.1. 下载ArcGIS软件:1.2. 下载 MaxEnt软件:1.3. 下载ENMtools: 二、数据准备与处理2.1. 物种分布数据2.2. 环境因子数据2.3. 地图数据2.4. 物种分布点去冗余2.4.1. 使用spThin包中的thin函数2.4.2. 或者…

使用耳机壳UV树脂制作私模定制耳塞有什么优点和缺点呢?

使用耳机壳UV树脂制作私模定制耳塞具有以下优点: 个性化定制:UV树脂可以根据用户的耳型进行个性化定制,使耳塞与用户的耳朵形状完美契合,提高舒适度和佩戴稳定性。高强度和耐磨性:UV树脂具有高强度和耐磨性&#xff0…

Spring Native 解放 JVM

一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用。与Java虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常…

C语言printf函数详解..

1.printf函数解析 前面我们有讲过printf函数的格式为: printf(“占位1 占位2 占位3……”, 替代1, 替代2, 替代3……); 今天我们进一步深入的解析一下这个函数 2.printf函数的特点 1.printf函数是一个变参函数(即参数的数量和类型都不确定) 2.printf函数的第一个…

Linux笔记之xhost +和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解

Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解 ——2024-02-11 code review! 文章目录 Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解xhost 的作用xhost 与 Docker 的关系 -e GDK_SCALE 和 -e GDK_DPI_SCALE详解GDK_SCALEGDK_DPI_SC…

Java集合 LinkedList

目录 LinkedList实例 LinkedList LinkedList是Java中的一个重要的数据结构,它实现了List接口,提供了链表数据结构的实现。LinkedList类中包含了各种常用的链表操作,如添加、删除、查找等。 LinkedList的特点是元素可以动态地添加到链表的任…

【转载】原生社区交友婚恋视频即时通讯双端APP源码 ONE兔2.0版

原生社区交友婚恋视频即时通讯双端APP源码下载ONE兔2.0版 包含后端、H5源码源码,Android源码,IOS源码

恒创科技:怎么看云主机的性价比

随着云计算技术的不断发展,云主机已经成为越来越多企业和个人用户的首选计算资源。然而,在选择云主机时,性价比是一个非常重要的考虑因素。那么,怎么看云主机的性价比呢? 通常来说,云主机的成本主要包括硬…

【调试】pstore原理和使用方法总结

什么是pstore pstore最初是用于系统发生oops或panic时,自动保存内核log buffer中的日志。不过在当前内核版本中,其已经支持了更多的功能,如保存console日志、ftrace消息和用户空间日志。同时,它还支持将这些消息保存在不同的存储…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

FFmpeg中的Color颜色参数解析、转码和HDR

前言 视频中帧的颜色信息非常重要,表示着编码时用到的标准,意味着解码时也要对应上,或者要使用正确的转换函数,否则就会带来色差问题。 关于FFmpeg中的颜色参数,有下边几个重要的结构体: 颜色参数相关的结…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

seatunnel数据集成(四)转换器使用

seatunnel数据集成(一)简介与安装seatunnel数据集成(二)数据同步seatunnel数据集成(三)多表同步seatunnel数据集成(四)连接器使用 seatunnel除了丰富的连接器类型,其转换…

【大厂AI课学习笔记】【1.6 人工智能基础知识】(3)神经网络

深度学习是机器学习中一种基于对数据进行表征学习的算法。观测值(例如一幅草莓照片)可以使用 多种方式来表示,如每个像素强度值的向量,或者更抽象地表示成一系列边、特定形状的区域等。 深度学习的最主要特征是使用神经网络作为计算模型。神经网络模型 …

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端:python 前端:vue.jselementui 框架:django/flask Python版本:python3.7 数据库:mysql5.7 数据库工具:Navicat 开发软件:PyCharm . 第一,研究分析python技术&#xff0c…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam(Acessing Steam)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者&…

使用UMAP降维可视化RAG嵌入

大型语言模型(LLMs)如 GPT-4 已经展示了出色的文本理解和生成能力。但它们在处理领域特定信息方面面临挑战,比如当查询超出训练数据范围时,它们会产生错误的答案。LLMs 的推理过程也缺乏透明度,使用户难以理解达成结论…