Python继承机制及其使用

Python 类的封装、继承、多态 3 大特性,前面章节已经详细介绍了 Python 类的封装,本节继续讲解 Python 类的继承机制。

继承机制经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类。也就是说,通过使用继承这种机制,可以轻松实现类的重复使用。

举个例子,假设现有一个 Shape 类,该类的 draw() 方法可以在屏幕上画出指定的形状,现在需要创建一个 Form 类,要求此类不但可以在屏幕上画出指定的形状,还可以计算出所画形状的面积。要创建这样的类,笨方法是将 draw() 方法直接复制到新类中,并添加计算面积的方法。实现代码如下所示:

class Shape:def draw(self,content):print("画",content)
class Form:def draw(self,content):print("画",content)def area(self):#....print("此图形的面积为...")

当然还有更简单的方法,就是使用类的继承机制。实现方法为:让 From 类继承 Shape 类,这样当 From 类对象调用 draw() 方法时,Python 解释器会先去 From 中找以 draw 为名的方法,如果找不到,它还会自动去 Shape 类中找。如此,我们只需在 From 类中添加计算面积的方法即可,示例代码如下:

class Shape:def draw(self,content):print("画",content)
class Form(Shape):def area(self):#....print("此图形的面积为...")

上面代码中,class From(Shape) 就表示 From 继承 Shape。

Python 中,实现继承的类称为子类,被继承的类称为父类(也可称为基类、超类)。因此在上面这个样例中,From 是子类,Shape 是父类。

子类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:

class 类名(父类1, 父类2, ...):#类定义部分

注意,如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python中所有类的父类,即要么是直接父类,要么是间接父类)。另外,Python 的继承是多继承机制(和 C++ 一样),即一个子类可以同时拥有多个直接父类。

注意,有读者可能还听说过“派生”这个词汇,它和继承是一个意思,只是观察角度不同而已。换句话话,继承是相对子类来说的,即子类继承自父类;而派生是相对于父类来说的,即父类派生出子类。

了解了继承机制的含义和语法之后,下面代码演示了继承机制的用法:

class People:def say(self):print("我是一个人,名字是:",self.name)
class Animal:def display(self):print("人也是高级动物")
#同时继承 People 和 Animal 类
#其同时拥有 name 属性、say() 和 display() 方法
class Person(People, Animal):pass
zhangsan = Person()
zhangsan.name = "张三"
zhangsan.say()
zhangsan.display()

运行结果,结果为:

我是一个人,名字是: 张三
人也是高级动物

可以看到,虽然 Person 类为空类,但由于其继承自 People 和 Animal 这 2 个类,因此实际上 Person 并不空,它同时拥有这 2 个类所有的属性和方法。

没错,子类拥有父类所有的属性和方法,即便该属性或方法是私有(private)的。

关于Python的多继承

事实上,大部分面向对象的编程语言,都只支持单继承,即子类有且只能有一个父类。而 Python 却支持多继承(C++也支持多继承)。

和单继承相比,多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。

使用多继承经常需要面临的问题是,多个父类中包含同名的类方法。对于这种情况,Python 的处置措施是:根据子类继承多个父类时这些父类的前后次序决定,即排在前面父类中的类方法会覆盖排在后面父类中的同名类方法。

举个例子:

class People:def __init__(self):self.name = Peopledef say(self):print("People类",self.name)
class Animal:def __init__(self):self.name = Animaldef say(self):print("Animal类",self.name)
#People中的 name 属性和 say() 会遮蔽 Animal 类中的
class Person(People, Animal):pass
zhangsan = Person()
zhangsan.name = "张三"
zhangsan.say()

程序运行结果为:

People类 张三

可以看到,当 Person 同时继承 People 类和 Animal 类时,People 类在前,因此如果 People 和 Animal 拥有同名的类方法,实际调用的是 People 类中的。

虽然 Python 在语法上支持多继承,但逼不得已,建议大家不要使用多继承。

Python继承机制及其使用相关推荐

  1. python编程语言继承_如何使用Python继承机制(子类化内置类型)

    我们知道,Python 中内置有一个 object 类,它是所有内置类型的共同祖先,也是所有没有显式指定父类的类(包括用户自定义的)的共同祖先.因此在实际编程过程中,如果想实现与某个内置类型具有类似行 ...

  2. python中的继承有什么特点_Python类的继承机制是什么

    继承是面向对象的三大特征之一,也是实现代码复用的重要手段.继承经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类. Pyt ...

  3. python的继承机制

    一.python的继承 python支持单继承和多继承,这种继承机制极大的提高了代码的复用性,使得子类可以继承父类和祖类的方法以及属性,这就是继承,同时,子类也可以重写父类和祖类的某个方法或者属性,从 ...

  4. python异常机制

    python异常处理机制 1.1python的内置异常 当我们在运行代码的时候一旦程序报错,就会终止运行,并且有的异常是不可避免的,但是我们可以对异常进行捕获,防止程序终止. python的内置异常是 ...

  5. Python培训教程分享:Python异常机制

    ​ 在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...

  6. python继承——封装

    python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...

  7. python 继承的规则

    本文讲述python继承规则. 先来看一些概念: 面向对象的概念 简单地说 面向对象编程(Object Oriented Programming)简称OOP 就是使我们分析.设计 和实现一个系统的方法 ...

  8. 【Python数据结构】 抽象数据类型 Python类机制和异常

    这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...

  9. python继承语法_python语法学习面向对象之继承

    python语法学习面向对象之继承 只要涉及到面向对象,"类"是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念 ...

最新文章

  1. 那些你不知道的Chrome(1)
  2. MD5+Base64加密(密码常用加密方式)
  3. 死磕Java并发:深入分析volatile的实现原理
  4. 乔布斯最伟大的贡献是什么
  5. Linux基础——linux和gcc的介绍
  6. C++总结笔记(七)—— 运算符重载
  7. ssl2290-潜水员【dp之二维费用】
  8. java 新浪短网址生成器,新浪短链接接口被限制?最新新浪短网址api接口
  9. 阿里扔给腾讯一个烫手山芋
  10. 谁说Python的shutil不支持7z解压缩,我来教你扩展它的功能!
  11. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com
  12. 字节跳动又启动期权回购了,这次价格142美元,较上一轮回购价涨8%
  13. PyCharm错误解决办法:ModuleNotFoundError: No module named 'matplotlib'
  14. 【转】VNode节点
  15. java项目启动失败的解决方案
  16. 集群语言 Python 入门 脚本工具
  17. IndentationError: expected an indented block缩进没问题但是出错
  18. 计算机免费证件照,完全免费!一键替换证件照背景色,再也不用花钱重新拍了...
  19. 夜晚网速变慢与网站服务器开机数量减少有关,【网络】网速慢的原因与对策
  20. 贴海报 (线段树染色-离散化

热门文章

  1. 【案例27】get table metadata error
  2. JumpServer 整合ldap认证
  3. 手机收费看高清电影能否成为趋势?
  4. 微型表格计算机,excel表格存储数据的最小单位-计算机中存储数据的最小单位是什么?...
  5. 数电课程设计--抢答器系统概述
  6. 一道题彻底理解 Pwn Heap Unlink
  7. 开源的防火墙 Linux 发行版:IPFire
  8. UHF射频读写器实现对EPCC1-G2电子标签的寻卡,读卡,写卡功能
  9. 华为鸿蒙几时有新机,华为鸿蒙系统正小规模测试 新机年底前推出或备货百万台...
  10. 计算机网络自考真题,自考计算机网络历年真题及答案汇编.pdf