我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python_类的继承

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python_类的继承

1.类的继承关系和生活中父亲、儿子、孙子之间的关系一样,Python中若A类继承B类,则A类称之为子类,B类称之为父类(也称为基类)。
2.类的继承方式分为:单继承、多继承两种;
类的单继承是指,A类只继承一个父类B,如下图所示:
Python_类的继承
类的多继承是指,A类可以继承多个父类,如下图所示:
Python_类的继承
3.类继承的顺序
如果子类继承一个或多个父类时,子类属性是任何调用的呢?见下图实例,我们定义的患者类继承了医院类和卫生局类,问题1.患者类和医院类中具有登记的方法(regpatien),此时子类调用该方法时是怎样调用的呢?问题2.子类中没有addr的属性,而两个父类中存在addr属性,此时子类在调用addr属性时能否正常调用?如果能正常调用,调用的又是哪个父类的addr属性?
问题1.见下图:
Python_类的继承
问题2.1.如果子类继承父类的顺序为先Hospital后Healthbureau,如下图所示:
Python_类的继承
问题2.2.如果子类继承父类的顺序为先Healthbureau后Hospital,如下图所示:

Python_类的继承
总结:1.子类继承父类时,在子类进行属性调用的顺序为:先查找自己的属性字典,若自己的属性字典中无该属性,则会依次按照继承父类的顺序来依次查找父类的属性字典;2.子类继承父类,当父类和子类均有相同的属性时,子类并不会影响父类的属性。总结起来就是:按继承的顺序来依次查询属性,一旦查到则停止;子类和父类的属性相互独立,互不影响;子类可以调用父类的属性,反之不行;
该部分的代码块为:

class Hospital():
    "医院类-->父类"
    addr = "医院地址为:无锡市解放路"
    depertment = ["超声科","放射科","内镜科"]
    def __init__(self,name,type,price):
        self.name = name
        self.type = type
        self.price = price
    def regpatien(self):
        print("--->>医院正在登记患者")

class Healthbureau():
    "卫生局类"
    addr = "卫生局类地址为:无锡市中心大夏"
    def __init__(self,heigh,size):
        self.heigh =heigh
        self.size =size

# class Patient(Hospital,Healthbureau):   #多继承,先Hospital后Healthbureau
class Patient(Healthbureau,Hospital):   #多继承,先Healthbureau后Hospital
    "患者类"
    def __init__(self,patientname,age,sex):
        self.patientname = patientname
        self.age = age
        self.sex =sex
    def regpatien(self):
        print("--->>患者已经成功成功")
    def tohispital(self):
        print("%s去%s检查"%(self.patientname,Hospital.depertment[2]))

#子类实例化
patient1 = Patient("李明",24,"男")
#父类Hospital实例化
hospital = Hospital("无锡市人民医院","江苏省无锡市人民大道","三甲")
#子类实例调用regpatien方法
patient1.regpatien()
#父类Hospital调用regpatien方法
hospital.regpatien()
#子类实例调用addr方法
print(patient1.addr)

深度解析类继承顺序
如何解析多层继承关系?
多层继承在python2和python3中解析的顺序不同,python2中是深度优先的原则,python3中是以广度优先的原则。继承顺序见下图:
Python_类的继承
Python_类的继承
继承原理:python到底是如何实现继承顺序的呢?对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表。
为了实现继承,python会在MRO列表上从左到右查找基类,直到找到第一个匹配这个属性的类为止。而这个MRO列表的构造是通过一个C3线性化算法来实现的。这个算法实际上就是合并所有父类的,MRO列表并遵循如下三条准则:
① 子类会由于父类被检查;
② 多个父类会根据他们在列表中的顺序被检查;
③ 如果对于下一个类存在两个合法的选择,应选择第一个父类;

为此我们可以直接使用子类的mro或者mro方法来查询它自身的继承顺序,如下图所示:

Python_类的继承

4.接口继承
从上面例子中我们可以看出,类的继承有2种含义,一是:子类继承基类的方法,并作出自己的扩展或改变(基类代码的重用);二是:声明某个子类兼容于某基类,父类定义一个接口类,子类继承接口类,并且实现接口类中定义的方法。
实践中,继承的第一种含义常常不建议使用,它是利小于弊,会出现代码的强耦合,不利于后面的维护和扩展;但接口的第二中含义十分重要,又称之为’接口继承’。
接口继承实质上是:“要求做出一个抽象,这个抽象规定了一个兼容接口,使得外部调用者无需了解具体细节,可一视同仁的处理实现了特定接口的所有对象。”这种在程序设计上称之为归一化。
例如:定义一个学校的基类,学校有不能的课程、学校有不同的活动,但是幼儿园的课程只是简单的字母识别、数数等,而大学的课程包含了微积分、专业课程等。如下图所示,通过接口的继承来实现上面的要求:

Python_类的继承
如果Kindergarten类或College类中没有定义course或activity函数时,实例化直接报错,如下图所示:

Python_类的继承

所以,接口继承就是在基类中定义子类要实现的方法名称(使用@abc.abstractclassmethod来装饰该函数,但它并未无实际功能),这样继承它的子类就必须要自定义这个函数功能,若子类没有该函数,则开始实例化就会报错。
这样我们如果知道某些类要实现某些相同名称但功能不能的函数时,就可以先定义一个父类,再在父类中定义必须要实现的功能。这样子类在继承父类时,就可以避免忘记必须要实现的功能函数了,它是用来规范子类的方法。实际上基类不用进行实例化操作,因为它完全没有意义。
该部分的代码块为:

import abc
class School(metaclass=abc.ABCMeta):
    "学校的基类"
    @abc.abstractclassmethod
    def course(self):
        "学校开课的方法"
        pass
    @abc.abstractclassmethod
    def activity(self):
        "校园活动的方法"
        pass

class Kindergarten(School):
    "幼儿园的类"
    def __init__(self,name,addr,number):
        self.name =name
        self.addr =addr
        self.number =number
    def course(self):
        "课程函数"
        print("%s开设了字母、识数等课程"%self.name)
    def activity(self):
        "比赛活动"
        print("%s参加了儿童舞蹈比赛"%self.number)

class College(School):
    "幼儿园的类"
    def __init__(self, name, addr, number):
        self.name = name
        self.addr = addr
        self.number = number
    # def course(self):
    #     "课程函数"
    #     print("%s开设了微积分、高等数学等课程" % self.name)
    def activity(self):
        "比赛活动"
        print("%s参加了大学口语比赛"%self.name)
    def  volunta(self):
        "义务活动"
        print("这是志愿者活动")

kindergarten =Kindergarten("文澜幼儿园","杭州市拱墅区",300)
kindergarten.activity()

college =College("浙江大学","杭州市上城区",65300)
college.course()

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python_类的继承

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python_类的继承

1.类的继承关系和生活中父亲、儿子、孙子之间的关系一样,Python中若A类继承B类,则A类称之为子类,B类称之为父类(也称为基类)。2.类的继承方式分为:单继承、多继承两种;类的单继承是指,A类只继承一个父类B,如下图所示:类的多继承是指
2023-01-31

类的继承

目录 什么是继承 为什么用继承 对象的继承 类的分类(了解) 新式类 经典类 继承与抽象
2023-01-31

python类的继承

面向对象的三大特性:封装、继承、多态继承时面向对象编程的优点之一类的继承与方法重载:继承的特点:减少代码和灵活定制新类子类具有父类的属性和方法子类不能继承父类的私有属性/方法子类可以添加新的方法子类可以修改父类的方法继承的语法:定义类时,在
2023-01-31

Python类中的单继承和多继承用法

本篇内容主要讲解“Python类中的单继承和多继承用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python类中的单继承和多继承用法”吧!前言Python面向对象编程语言,有List、Str
2023-06-02

静态类不能被继承(其继承类不能被实例化,等于不能继承)

开始听同事在那讨论,有人问静态类是否能被继承,我觉得是不能,但没有找到有说服力的例子,于是写了一段简单的代码来测试,如下:public class staticTest {static class aa{ void abc(){System
2023-06-03

java如何继承类

在Java语言中,实现类的继承使用extends关键字格式如下: (推荐学习:java课程)[public] class SubClass extends SuperClass{  //类体的定义}2、被继承的类称为
java如何继承类
2016-05-21

java怎么继承类

一、基本知识(推荐:java视频教程)1、在Java语言中,实现类的继承使用extends关键字格式如下:[public] class SubClass extends SuperClass{  //类体的定义}2、被继承的类称为父类或超类或基类,而继承得到的
java怎么继承类
2018-09-11

php中类继承与接口继承的区别是什么

正文类继承和接口继承是PHP中扩展和重用代码的不同机制。类继承创建子类,继承父类的属性和方法。接口继承定义行为契约,类可以实现它们。关键差异在于可见性(类继承仅继承公共和受保护成员)、职责(类继承扩展功能,接口继承定义行为)、代码重用(类继承自动继承,接口继承实现契约)。使用类继承时,子类必须遵循父类实现,而使用接口继承时,类可以更自由地实现行为。PHP不支持多重类继承,但支持多重接口继承。选择哪种机制取决于需求,例如代码重用、一致性和灵活性。
php中类继承与接口继承的区别是什么
2024-04-25

php中类继承与接口继承的区别是什么

在PHP中,类继承与接口继承的区别是:PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,而接口支持多继承,也就是接口可以继承一个或者多个接口。
2015-02-22

java什么是类的继承

Java 中类的继承是通过扩展其他类而形成新类来实现的,原来的类称为父类(super class)或基类,新类称为原来类的子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法,使得父类的基本特征可被所有子类的对象共享。推荐:java视频教
java什么是类的继承
2014-09-27

php中类继承与接口继承的区别有哪些

今天小编给大家分享一下php中类继承与接口继承的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在PHP中,类继承与
2023-06-29

怎么理解Python类的继承

这篇文章主要讲解了“怎么理解Python类的继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Python类的继承”吧!1、对继承的理解继承(Inheritance) :代码复用的高
2023-06-25

python3--类的组合,初始类的继承

面向对象的组合用法软件重用的重要方式除了继承之外还有另外一种方式,即:组合组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合例1#人狗大战classPerson:def__init__(self,name,sex,hp,ad
2023-01-30

python 继承2个父类

#!/usr/bin/env pythonclass father(object): def __init__(self,tail,heav): self.tail=tail self.heav=heavclass mother(obje
2023-01-31

JavaScript 类的进化:继承的力量

JavaScript 中类的概念不断演变,继承功能的引入为面向对象编程提供了强大动力。本文探讨 JavaScript 中不同类型的继承机制,展示它们的优缺点,并提供示例代码来阐明关键概念。
JavaScript 类的进化:继承的力量
2024-02-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录