Python进阶-----面对对象4.0(面对对象三大特征之--继承)

news2025/6/29 9:29:17

目录

前言:

Python的继承简介

1.什么是继承 

2.继承的好处

 3.object类

继承的相关用法

 1.继承的定义与法则

2.对继承的重写

 3.(单继承)多层继承

4.多继承

 5.多继承重写时调用父类方法


前言:

        在讲之前,我想说说中国古代历史。我们都知道在古代,君王的传位是遵循嫡长子继承制的,皇帝的位置一般是传给太子的,那在继承的过程中也就是说皇帝的所有权利以及所拥有的东西都会传给下一个皇帝,但是相关的规矩一般是不会变化的,比如说朝代的国号以及一些重要制度,但是这不代表新皇帝不可以去改革,比如战国时期秦国的商鞅变法。

        好了这里讲这么多,我们对“继承”这个词有点理解吧,在Python中也基本上是遵循这样的规则的,废话不多说,一起来看看吧!!!

Python的继承简介

1.什么是继承 

        继承嘛,顾名思义就是后者继承先者的某些特征和属性,比如说:儿子继承老爸的股份,太子继承皇位等等。在Python中,被继承的类叫做父类,继承的类叫做子类,子类继承父类的属性和方法

2.继承的好处

  • 继承可以解决重复类的代码造成的冗余

  • 继承可以提高代码的复用性

 3.object类

在python中所有的类都继承于object,object就是基类,超类 ,所以object类是所有类的父类

class A:
    pass
class B(object):
    pass
#object类是所有类的父类,也就是说如果一个类没有指定继承哪个类,那么就会默认继承object类
#所以A和B类都是继承object类,是一样的

我们可以去通过dir()  来获取object类具有的方法,如下所示:

class A(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
a=A('Jack',15)
print(a)
#输出结果:<__main__.A object at 0x00000216806D0460>

继承的相关用法

 1.继承的定义与法则

定义

class Son(Father):

 法则

一般来说,子类可以继承父类的属性和方法,但是这些属性和方法都是公有的,不是私有化的,所以父类的私有化属性和方法是继承不了的

示例:

class Oldking(object):
    def __init__(self,name,clothes,seal,mausoleum):
        self.name=name
        self.clothes=clothes
        self.seal=seal
        self.__mausoleum=mausoleum#私有化属性
    def dynasty(self):
        print('唐朝')
    def __years(self): #私有化方法
        print('贞观之治')

class Newking(Oldking):
    pass

t=Newking('武则天','龙袍','玉玺','帝陵')
print(t.name,t.clothes,t.seal) #这里无法输出  帝陵,因为被父类私有化了
t.dynasty()  #同时也无法所以__years() 方法,这个方法也是私有化了
#输出结果:武则天 龙袍 玉玺
#         唐朝

2.对继承的重写

        新皇帝可以继承老皇帝的权利,那当然可以进行相关制度的改革,或者说是年号的改革,比如说唐太宗年号为贞观之治,武则天的是贞观遗风。所以我们在Python中子类也可以对父类继承的东西进行重写。

class Old(object):
    def __init__(self):
       self.king='隋炀帝'
       self.clothes='龙袍'
    def dynasty(self):
        print('这是隋朝')

class New(Old):
    def __init__(self):
        self.king='唐高祖'
        self.clothes=Old().clothes
    def dynasty(self):
        print('这是唐朝')
t=New()
print(t.king,t.clothes)
t.dynasty()
#输出结果:唐高祖 龙袍
#         这是唐朝

这个示例可以看出,重写了朝代和皇帝的名字,然而对龙袍进行了保留继承

 3.(单继承)多层继承

        多层继承就涉及到父类继承其父类,子类又继承父类,就是一种继承的嵌套,也就是孙子继承父亲的,父亲继承爷爷的。当然在每次继承的过程中也是可以对相关内容进行重写。在继承过程中,属性的查找顺序是先从自身属性去查找,如果找不到就去父类去查找,如果父类还找不到就去爷爷类查找,以此类推……

        顺序:对象>子类>父类>父父类

示例:

class Grandpa(object):
    def __init__(self):
        self.__name='史蒂夫'
        self.money=100
    def fun(self):
        print('传家宝:尚方宝剑')
class Father(Grandpa):
    def __init__(self):
        self.money=2**10
class Son(Father):
    def college(self):
        print('GUET')
AJ=Son()
print(AJ.money)
AJ.fun()
AJ.college()
#输出结果:
# 1024
# 传家宝:尚方宝剑
# GUET

这个也是很好理解的,如果父类没有特定设置私有化属性的话,子类会一一继承,如果一直嵌套下去的话,到最后子类具有的属性和特点会非常多,这就是一个累积过程。当我们去创建一个实例对象,然后去查找这个实例对象相关属性和方法时,这会依次向父类查找,直到找到为止。

4.多继承

        多继承是表示一个子类具继承个父类,也就是说一个儿子有多个父亲(到处认爹) 一个子类继承多个父类的东西。

继承顺序:在继承中出现相同方法则继承顺序是从左到右

示例1: 

class Father0(object):
    def fun(self):
        print('有钱')
class Father1(object):
    def fun(self):
        print('穷')
class Son0(Father0,Father1):
    pass
class Son1(Father1,Father0):
    pass
Jack=Son0()
jb=Son1() #输出结果:有钱
Jack.fun()
jb.fun() #输出结果:穷

在多继承中,我们可以去通过__mro__方法去查看继承的属性,(从左到右)

示例2: 

class G:
    pass
class E(G):
    pass
class F(G):
    pass
class B(E):
    pass
class C(F):
    pass
class D(G):
    pass
class A(B, C, D):
    pass
son=A()
print(A.__mro__) #查看相同的方法继承顺序

输出结果:

顺序为:A->B->E->G->C->F->D->object

 5.多继承重写时调用父类方法

 

在重写多/但继承父类的方法时,但是又想调用父类的方法,这时候就用到super() 方法

 super() 方法是按照上面所说的继承顺序来执行的,也就是执行第一个继承的父类的方法

class Sheep(object):
    def sound(self):
        print('咩咩咩')
class Cat(object):
    def sound(self):
        print('喵喵喵')
    def animal(self):
        print('猫咪')
class Dog(Sheep):
    def animal(self):
        print('小狗')
class A(Dog,Cat):
    def sound(self):
        print('哈哈哈')
        super().sound() #调用(按照顺序)父类的方法
tt=A()
tt.sound()
#输出结果:哈哈哈
#        咩咩咩

可能会有些人疑惑,明明Dog没有定义sound() 方法,但是又为什么可以找到呢,其实是Dog继承了Sheep类,是在这里找到了sound() 方法

其实如果我们想去直到调用哪一个父类的方法,我们可以直接去声明调用:

父类.方法(self)

class Cat(object):
    def sound(self):
        print('喵喵喵')
    def animal(self):
        print('猫咪')
class Dog(object):
    def animal(self):
        print('小狗')
class A(Dog,Cat):
    def sound(self):
        Cat.sound(self)####
        print('哈哈哈')
tt=A()
tt.sound()
print(A.__bases__)
#输出结果:喵喵喵
#        哈哈哈

好了,这一期就到这里了先,我们下一期再见~~~

分享一张壁

 

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

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

相关文章

servlet注解开发

文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…

推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 日历对我们来说&#xff0c;最熟悉的就是阳历和农历&#xff0c;在中国每年都有固定的节日、节气、中国特有传统节日&#xff0c;有些节日是固定的&#xff0c;但是节气这些都需要我们经过一定规则换算出来。 所…

【JavaSE】数组的定义和使用(上)

数组的定义和使用&#xff08;上&#xff09;6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…

【Python - Matplotlib】P1 Matplotlib2D 快速入门

Matplotlib 2D什么是&#xff0c;为什么选择快速上手三层结构图像层结构一览图画图三步法补充画布设置设定图像的长宽以及清晰度代码将图片保存前言 本节为 Matplotlib 简单专题第一节&#xff0c;简单介绍 Matplotlib 的结构&#xff0c;画图三步法&#xff0c;以及介绍一个简…

认识Spring(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 什么是spring 什么是IOC 传统开发 IOC DI spring的创建使用 pom.xml spring.xml 取出bean对象 ApplicationContext BeanFactory App…

【NLP相关】PyTorch多GPU并行训练(DataParallel和DistributedDataParallel介绍、单机多卡和多机多卡案例展示)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

@Transactional详解

一、事务的概念 百度百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执 行单元(unit)。事务通常由高级数据库操纵语言或编程语言&#xff08;如SQL&#x…

第十四届蓝桥杯三月真题刷题训练——第 1 天

目录 题目1&#xff1a;数列求值 代码&#xff1a; 题目2&#xff1a;质数 代码&#xff1a; 题目3&#xff1a;饮料换购 代码&#xff1a; 题目1&#xff1a;数列求值 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出…

vulnhub five86-1

总结:私钥登录&#xff0c;隐藏文件很多 目录 下载地址 漏洞分析 信息收集 网站渗透 爆破密码 提权 下载地址 Five86-1.zip (Size: 865 MB)Download (Mirror): https://download.vulnhub.com/five86/Five86-1.zip使用&#xff1a;下载以后打开压缩包&#xff0c;使用vm直…

数据结构(二)(嵌入式学习)

大 家 好 今天讲讲算法和哈希函数&#xff0c;数据结构基础请跳转数据结构&#xff08;一&#xff09; 数据结构干货总结&#xff08;二&#xff09;算法常见的数据结构及算法你以为我要都讲嘛&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#…

SpringMVC源码:getHandler、getHandlerAdapter过程

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

机器学习|多变量线性回归 | 吴恩达学习笔记

前文回顾&#xff1a;机器学习 | 线性回归&#xff08;单变量&#xff09; 目录 &#x1f4da;多维特征 &#x1f4da;多变量梯度下降 &#x1f4da;梯度下降法实践 &#x1f407;特征缩放 &#x1f407;学习率 &#x1f4da;特征和多项式回归 &#x1f4da;正规方程 &…

开发手册——一、编程规约_6.并发处理

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】获取单例对象需要保证线程安全&#xff0c;其中的方法也要保证线程安全。 说明&#xff1a;资源驱动类、工具类、单例工厂…

Microsoft designer 使用教程

继各种ai绘图软件诞生之后 dell 2 playground.... 微软自己研发的重量级产品 Microsoft designer 上线了 Microsoft Designer 是微软公司推出的一款设计工具&#xff0c;主要用于快速创建Web和移动应用程序的原型设计。它提供了一系列的工具和模板&#xff0c;可以帮助用户…

Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap

文章目录1.认识Redis1.1.优点1.2.缺点2.在Django中Redis的连接3.Redis的基础用法3.1.hashmap结构3.2.list结构4.命令行查看数据库5.作者答疑1.认识Redis Remote DIctionary Server(Redis) 是一个key-value 存储系统&#xff0c;是跨平台的非关系型数据库。是一个开源的使用 AN…

【分布式】什么是分布式,分布式和集群的区别又是什么?答案在正文。

文章目录1. 什么是分布式 ?2. 分布式与集群的区别 ?3.用一个请求串起来4.一个简化的架构图5.分布式环境的特点6.分布式环境下面临的问题7.总结1. 什么是分布式 ? 分布式系统一定是由多个节点组成的系统。 其中&#xff0c;节点指的是计算机服务器&#xff0c;而且这些节点一…

Stochastic Approximation —Stochastic gradient descent 随机近似方法的详解之(四)随机梯度下降

Stochastic Approximation —Stochastic gradient descent 随机近似方法的详解之&#xff08;四&#xff09;随机梯度下降 郑重声明&#xff1a;本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列&#xff0c;本推文出于非商业目的分享个人学习笔记和心得。如有侵权…

【微信小程序】-- 案例 - 本地生活(二十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【数据结构初阶】堆排序

目录 前言 概念 堆排序的实现 1.建堆 &#xff08;1&#xff09;堆向上调整算法 &#xff08;2&#xff09;堆的向下调整算法 2. 利用堆删除思想来进行排序 3.堆排序的时间复杂度 4.源码 总结 前言 前边我们学习了堆的实现&#xff0c;对堆的每个接口都进行了详细的讲…

js中getBoundingClientRect()方法

getBoundingClientRect()返回值是一个 DOMRect 对象&#xff0c;是包含整个元素的最小矩形&#xff08;包括 padding 和 border-width&#xff09;。该对象使用 left、top、right、bottom、x、y、width 和 height 这几个以像素为单位的只读属性描述整个矩形的位置和大小。除了 …