一篇文章带你搞懂Python中的继承和多态

一、继承的介绍

继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。继承是类与类之间的关系。

继承可以减少代码冗余、提高重用性。

在现实生活中,继承一般指的是子女继承父辈的财产,如下图:

二、如何用继承?

1.继承语法

Class 派生类名(基类名):#基类名写在括号里。

在继承关系中,已有的,设计好的类称为父类或基类,新设计的类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。

2. 继承的特点

  1. 在继承中基类的构造函数(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

  2. 如果需要在派生类中调用基类的方法时,通过“基类名.方法名()”的方法来实现,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self 参数。也可以使用内置函数super()实现这一目的。

  3. Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找(先在本类查找调用的方法,找不到才去基类中找)。

3. 单继承

3.1 单继承

例:

1class Animal: #父类 2 def eat(self): 3 print("-----吃-----") 4 5 def drink(self): 6 print("-----喝-----") 7 8 9class Dog(Animal): #子类继承父类 10 """ 11 def eat(self): 12 print("-----吃-----") 13 14 def drink(self): 15 print("-----喝-----") 16 """ 17 pass 18 19 20class Cat: 21 pass 22 23 24wang_cai = Dog() 25wang_cai.eat() 26wang_cai.drink()

运行结果:

3.2 多层继承

例:

1class Animal: 2 def eat(self): 3 print("-----吃-----") 4 5 def drink(self): 6 print("-----喝-----") 7 8 9class Dog(Animal): 10 def bark(self): 11 print("-----汪汪叫------") 12 13 14class XTQ(Dog): 15 """定义了一个哮天犬 类""" 16 pass 17 18 19class Cat(Animal): 20 def catch(self): 21 print("----捉老鼠----") 22 23 24xtq = XTQ() 25xtq.eat() 26xtq.bark()

运行结果:

3.3 重写父类方法

例:

1class Animal: 2 def eat(self): 3 print("-----吃-----") 4 5 def drink(self): 6 print("-----喝-----") 7 8 9class Dog(Animal): 10 def bark(self): 11 print("-----汪汪叫------") 12 13 14class XTQ(Dog): 15 """定义了一个哮天犬 类""" 16 pass 17 18 19class Cat(Animal): 20 def catch(self): 21 print("----捉老鼠----") 22 23 24xtq = XTQ() 25xtq.eat() 26xtq.bark()

运行结果:

4. 多继承

4.1 多继承

从图中能够看出,所谓多继承,即子类有多个父类,并且具有它们的特征。

Python中多继承的格式如下:

1# 定义一个父类 2class A: 3 def printA(self): 4 print('----A----') 5 6# 定义一个父类 7class B: 8 def printB(self): 9 print('----B----') 10 11# 定义一个子类,继承自AB 12class C(A,B): 13 def printC(self): 14 print('----C----') 15 16obj_C = C() 17obj_C.printA() 18obj_C.printB()

运行结果:

`----A----``----B----`

Python中是可以多继承的,父类中的方法、属性,子类会继承。

想一想:

如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?

1#coding=utf-8 2class base(object): 3 def test(self): 4 print('----base test----') 5class A(base): 6 def test(self): 7 print('----A test----') 8 9# 定义一个父类 10class B(base): 11 def test(self): 12 print('----B test----') 13 14# 定义一个子类,继承自AB 15class C(A,B): 16 pass 17 18 19obj_C = C() 20obj_C.test() 21 22print(C.__mro__) #可以查看C类的对象搜索方法时的先后顺序

运行结果:

5. 多态

5.1 什么是多态?

多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。

  • Python伪代码实现Java或C#的多态。

5.2  案例

Python  “鸭子类型”

1 2class Duck: 3 def quack(self): 4 print("Quaaaaaack!") 5 6 7class Bird: 8 def quack(self): 9 print("bird imitate duck.") 10 11 12class Doge: 13 def quack(self): 14 print("doge imitate duck.") 15 16 17def in_the_forest(duck): 18 duck.quack() 19 20 21duck = Duck() 22bird = Bird() 23doge = Doge() 24for x in [duck, bird, doge]: 25 in_the_forest(x)

运行结果:

三、总结

本文以生活中的基础现象为切入点,主要介绍了Python基础中继承和多态,包括单继承、多继承的语法、多态常见的 “鸭子类型”、 以及如何重写父类的方法都做了详细的讲解。

用丰富的案例帮助大家更好理解,使用Python编程语言,方便大家更好理解,希望对大家的学习有帮助。

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/XkBe1QlCt4WDQDG_Qf-kWA,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

java中经常问到的面试题

1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例

你不可不知的JS面试题(第二期)

1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa

Python的新式类和旧式类

概述:Python中支持多继承,也就是一个子类可以继承多个父类/基类。当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类和经典类的区别。多继承:classFood(object):23def__init__(self,name,col

python类的继承

一、概述   面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。  通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些OOP语言中,一个子类可以继

Python Day24:类的继承、派生、覆盖、super()、绑定、非绑定方法

类的继承、派生、覆盖、super()python类的继承:子类继承父类,只需要在定义类的时候在类名后面加上(父类名)。继承之后,父类的属性方法、子类都可以访问派生:子类继承父类后,自己在父类的基础上,又添加了一些属于自己特性的属性、方法

Java的类继承

知识点1、继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足isa的逻辑关系,才能使用继承。如:苹果isa水果语法:使用extends连接子类和父类。子类extends父类Java是单继承,一个类只能继承一个父类。子类不能继承父类私有的属性,但是可以