热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python面向对象编程三大特性之继承

继承继承也是面向对象编程三大特性之一继承是类与类的一种关系定义一个新的class时,可以从某个现有的class继承新的class类就叫子类(Subclass)被继承的类一般称为父类

继承



  • 继承也是面向对象编程三大特性之一

  • 继承是类与类的一种关系

  • 定义一个新的 class 时,可以从某个现有的 class 继承

  • 新的 class 类就叫子类(Subclass)

  • 被继承的类一般称为父类、基类、超类

  • 通俗理解:子类与父类的关系,即爸爸与儿子,爸爸有了个儿子,儿子继承爸爸的属性和方法,爸爸的爸爸就是爷爷...以此类推

 


继承的实际栗子



  • 猫、狗都是动物,所以动物是父类,猫、狗是动物的子类

  • 小菠萝、大菠萝都是人类,所以人类是父类,小菠萝、大菠萝是人类的子类

  • 动物、人类都是生物,所以生物是父类,动物、人类是生物的子类

  • 那么一般称生物类是猫、狗、小菠萝、大菠萝的超类、祖父类

 


继承的好处



  • 实现代码的重用,相同的代码不需要重复编写

  • 子类拥有父类的所有属性、方法,提高了代码的可扩展性和重用性

  • 在子类继承父类的同时,也可以重新定义某些属性,并重写某些方法,即覆盖父类的属性、方法,变成子类独有的属性、方法

  • 子类也可以添加新的属性、方法

 


继承的使用场景



  • 假如我需要定义几个类,而类与类之间有一些公共的属性和方法

  • 可以把公共的属性和方法提取作为父类(基类)的属性、方法,而特殊的属性、方法则在本类中定义

  • 比如猫、狗都有吃喝拉撒四种行为,这些就是公共方法;但只有猫会喵喵叫,只有狗会汪汪叫,这些就是特殊方法

具体可以看下面的【不使用继承、使用继承的区别】

 


继承有几种?



  1. 单继承

  2. 多继承

 


Python 中继承的简单语法

class Parent:
pass
class Child(Parent):
pass

  


有个重点

所有类的都有一个共同父类,就是 object,默认会继承它,写或不写都一样

class Parent:
pass
class Parent(object):
pass

 


不使用继承、使用继承的区别


需求背景

有一个动物类、狗类、猫类



  • 动物类有吃、喝、跑方法

  • 狗类有吃、喝、跑、汪汪叫方法

  • 猫类有吃、喝、跑、喵喵叫方法

 


不使用继承


类图

 


需求分析



  • 每个类都拥有自己的方法

  • 他们都拥有吃、喝、拉方法,且功能一样

 


实际代码

# 不使用继承
class Animal:
def eat(self):
print("吃东西...")
def drink(self):
print("喝水...")
def run(self):
print("跑步...")
class Cat:
def eat(self):
print("吃东西...")
def drink(self):
print("喝水...")
def run(self):
print("跑步...")
def miao(self):
print("喵喵叫...")
class Dog:
def eat(self):
print("吃东西...")
def drink(self):
print("喝水...")
def run(self):
print("跑步...")
def wang(self):
print("汪汪叫...")

 


这样写有什么问题?



  • 三个类,需要重复写三次吃、喝、跑的方法

  • 假设此时需要修改 吃 方法的代码,那么还得同步修改三个类的 吃 方法,属于不必要的重复性工作

  • 使用继承可以大大减少开发工作量

 


使用继承


类图

从类图就能看到,使用继承就变得简单多了

 


需求分析



  • 提取三个类的公共方法,吃、喝、跑,然后抽象成动物类

  • 所以动物类是一个父类,狗类、猫类继承它

 


实际代码

# 使用继承
class Animal:
def eat(self):
print("吃东西...")
def drink(self):
print("喝水...")
def run(self):
print("跑步...")
class Cat(Animal):
def miao(self):
print("喵喵叫...")
class Dog(Animal):
def wang(self):
print("汪汪叫...")

 


优势



  • 子类继承父类,可以直接享受父类已经封装好的方法,不再需要自己开发一次

  • 子类可以根据自身的需要,封装子类独有的属性、方法,比如猫类的喵喵叫,狗类的汪汪叫 

 


专业术语总结



  • Dog 类是 Animale 类的子类,Animal 类是 Dog 类的父类,Dog 类从 Animal 类继承

  • Dog 类是 Animale 类的派生类,Animal 类是 Dog 类的基类,Dog 类从 Animal 类派生

  


继承的传递性


什么是传递性


通俗来讲



  • C 类从 B 类继承,B 类又从 A 类继承

  • 那么 C 类会拥有 A、B 类的所有属性和方法

 


官方来讲

子类拥有父类以及父类的父类,以及所有父类的父类的父类...中封装的所有属性、方法

 


实际栗子



  • 还是拿上面的动物类、狗类、猫类继续展开讲

  • 假设此时有一个新的类叫柴犬类,继承于狗类,有独有的方法摇尾巴

 


类图

 


实际代码

class Animal:
def eat(self):
print("吃东西...")
def drink(self):
print("喝水...")
def run(self):
print("跑步...")
class Cat(Animal):
def miao(self):
print("喵喵叫...")
class Dog(Animal):
def wang(self):
print("汪汪叫...")
class Chai(Dog):
def shake(self):
print("小柴柴摇尾巴...")
chai = Chai()
# 调用 父类的父类 的方法
chai.eat()
# 调用 父类 的方法
chai.wang()
# 调用 自己独有 的方法
chai.shake()
# 输出结果
吃东西...
汪汪叫...
小柴柴摇尾巴...


  • Chai 类拥有 Dog 类、Animal 类所有属性、方法

  • 但它不会拥有 Cat 类的属性、方法,因为他们没有继承关系

 


继承和抽象

抽象即抽取类似或者说比较像的部分

 


小栗子



  • 从小菠萝、小韵韵两个对象中,抽取公共部分抽象成父类

  • 再从人,猪,狗这三个类,抽取公共部分抽象成父类

 


继承的重点



  • 是基于抽象的结果,通过编程语言去实现它

  • 先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构

  • 抽象只是分析和设计的过程中,一个动作或者说一个技巧,通过抽象得到一个类

  


代码栗子

class Animal:
def __init__(self, name, age, sex):
self.__name = name
self.__age = age
self.__sex = sex
# 提取的公共方法
def eat(self):
print(f"{self.__name} 正在吃饭....")
@property
def name(self):
return self.__name
class Person(Animal):
def walk(self):
print(f"{self.name} 两条腿正在走路")
class Pig(Animal):
def kill(self):
print(f"{self.name} 猪正在去屠宰场ing...")
class Dog(Animal):
def wang(self):
print(f"{self.name} 汪汪叫ing...")
person = Person("小菠萝", 25, "Male")
pig = Pig("麦兜", 4, "公")
dog = Dog("柴犬", 3, "母")
# 调用父类的公共方法
person.eat()
pig.eat()
dog.eat()
# 调用子类独有的方法
person.walk()
pig.kill()
dog.wang()
# 输出结果
小菠萝 正在吃饭....
麦兜 正在吃饭....
柴犬 正在吃饭....
小菠萝 两条腿正在走路
麦兜 猪正在去屠宰场ing...
柴犬 汪汪叫ing...

  



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
小宇宇宙2502862273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有