Python继承机制及其使用
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继承机制及其使用相关推荐
- python编程语言继承_如何使用Python继承机制(子类化内置类型)
我们知道,Python 中内置有一个 object 类,它是所有内置类型的共同祖先,也是所有没有显式指定父类的类(包括用户自定义的)的共同祖先.因此在实际编程过程中,如果想实现与某个内置类型具有类似行 ...
- python中的继承有什么特点_Python类的继承机制是什么
继承是面向对象的三大特征之一,也是实现代码复用的重要手段.继承经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类. Pyt ...
- python的继承机制
一.python的继承 python支持单继承和多继承,这种继承机制极大的提高了代码的复用性,使得子类可以继承父类和祖类的方法以及属性,这就是继承,同时,子类也可以重写父类和祖类的某个方法或者属性,从 ...
- python异常机制
python异常处理机制 1.1python的内置异常 当我们在运行代码的时候一旦程序报错,就会终止运行,并且有的异常是不可避免的,但是我们可以对异常进行捕获,防止程序终止. python的内置异常是 ...
- Python培训教程分享:Python异常机制
在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...
- python继承——封装
python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...
- python 继承的规则
本文讲述python继承规则. 先来看一些概念: 面向对象的概念 简单地说 面向对象编程(Object Oriented Programming)简称OOP 就是使我们分析.设计 和实现一个系统的方法 ...
- 【Python数据结构】 抽象数据类型 Python类机制和异常
这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...
- python继承语法_python语法学习面向对象之继承
python语法学习面向对象之继承 只要涉及到面向对象,"类"是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念 ...
最新文章
- 那些你不知道的Chrome(1)
- MD5+Base64加密(密码常用加密方式)
- 死磕Java并发:深入分析volatile的实现原理
- 乔布斯最伟大的贡献是什么
- Linux基础——linux和gcc的介绍
- C++总结笔记(七)—— 运算符重载
- ssl2290-潜水员【dp之二维费用】
- java 新浪短网址生成器,新浪短链接接口被限制?最新新浪短网址api接口
- 阿里扔给腾讯一个烫手山芋
- 谁说Python的shutil不支持7z解压缩,我来教你扩展它的功能!
- java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com
- 字节跳动又启动期权回购了,这次价格142美元,较上一轮回购价涨8%
- PyCharm错误解决办法:ModuleNotFoundError: No module named 'matplotlib'
- 【转】VNode节点
- java项目启动失败的解决方案
- 集群语言 Python 入门 脚本工具
- IndentationError: expected an indented block缩进没问题但是出错
- 计算机免费证件照,完全免费!一键替换证件照背景色,再也不用花钱重新拍了...
- 夜晚网速变慢与网站服务器开机数量减少有关,【网络】网速慢的原因与对策
- 贴海报 (线段树染色-离散化
热门文章
- 【案例27】get table metadata error
- JumpServer 整合ldap认证
- 手机收费看高清电影能否成为趋势?
- 微型表格计算机,excel表格存储数据的最小单位-计算机中存储数据的最小单位是什么?...
- 数电课程设计--抢答器系统概述
- 一道题彻底理解 Pwn Heap Unlink
- 开源的防火墙 Linux 发行版:IPFire
- UHF射频读写器实现对EPCC1-G2电子标签的寻卡,读卡,写卡功能
- 华为鸿蒙几时有新机,华为鸿蒙系统正小规模测试 新机年底前推出或备货百万台...
- 计算机网络自考真题,自考计算机网络历年真题及答案汇编.pdf