Python学习笔记四(面向对象)

传送门

python及pycharm安装配置-CSDN博客

Python学习笔记(一)-CSDN博客

Python学习笔记(二)-CSDN博客

Python学习笔记三(面向对象)-CSDN博客

python学习笔记五(面向对象实战版)-CSDN博客

目录

一、继承

1.1什么是继承

题外话:多继承的问题

1.2重写

1.3 super()函数

1.3.1调用父类的方法

1.3.2多重继承中的调用(硬核)

1.3.3 super的工作原理

二、多态

三、抽象类和接口


一、继承

1.1什么是继承

在上一章我们讲了python面向对象的基本概念以及封装、继承、多态三大特性中的封装,这个部门我们来说继承和多态。

还是举个栗子来引入继承。

猫和狗都属于动物。动物都会吃饭和喝水,也会跑,那么我们定义一个动物类,并且定义吃饭、喝水、跑这三种方法,现在我们需要定义猫类和狗类,我们照例也需要给猫类狗类定义吃饭、喝水、跑这三种方法。大家发现问题没,那如果我现在需要继续定义兔子,老虎,鸟,狮子等等几十个类,那就要复制粘贴几十中方法写到每个类中,费时费力,代码也看着头疼。

这个时候我们就用到继承机制,继承机制经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类。也就是说,通过使用继承这种机制,可以轻松实现类的重复使用。就像父母和孩子一样,你有父母的共同特征,所以,像动物类,我们称之为父类,猫、狗这些继承动物类的,我们称之为子类。

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

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

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

以下例子中,Person同时继承People类和Animal类,所以同时有say方法和display方法。

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()

#输出结果
我是一个人,名字是: 张三
人也是高级动物

题外话:多继承的问题

事实上,大部分面向对象的编程语言,都只支持单继承,即子类有且只能有一个父类。而 Python 却支持多继承。我自己的体验是当时学java时觉得java的继承很清晰,代码也很容易看,而python的多继承有时候我会看着不习惯。和单继承相比,多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用。并且,和单继承相比,使用多继承经常需要面临的问题是,多个父类中包含同名的类方法。

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