Python学海无涯路【第33回】:类的继承


1、继承

1.1、类的继承


class Animal:
    def eat(self):
        print("吃东西")

    def breathe(self):
        print("呼吸")


class Fish(Animal):

    def breathe(self):
        print("鱼用腮呼吸")


if __name__ == '__main__':
    fish = Fish()
    fish.eat()
    fish.breathe()

输出:
吃东西
鱼用腮呼吸

1.2、接口继承

  • 接口不能实例化
  • 接口的派生类必须实现基类中的全部函数
import abc


class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def eat(self):
        '''吃'''
        pass

    @abc.abstractmethod
    def breathe(self):
        '''呼吸'''
        pass


class Fish(Animal):
    def eat(self):
        print("鱼吃东西")

    def breathe(self):
        print("鱼用腮呼吸")


if __name__ == '__main__':
    fish = Fish()
    fish.breathe()

1.3、类的继承顺序

1.3.1、 经典类和新式类

  • Python2.x中,默认都是经典类,只有显式继承了object才是新式类
  • Python 3.x中取消了经典类,默认都是新式类,并且不必显式的继承object。
  • 经典类遵循深度优先的规则
  • 新式类遵循广度优先的规则
  • 新式类从Python2.2开始的
  • 新式类的出现改变了经典类中一个多继承的bug, 因为其采用了广度优先的算法

Python2.x中经典类和新式类的定义如下:

#Python2.x中经典类和新式类的定义如下
class Person(object):pass   #新式类写法
class Person():pass         #经典类写法
class Person:pass           #经典类写法

Python3.x中经典类和新式类的定义如下:

#Python3.x中取消了经典类,默认都是新式类
#以下三种写法无区别
class Person(object):pass
class Person():pass
class Person:pass

1.3.1、经典类和新式类的继承顺序

  • 经典类遵循深度优先的规则
  • 新式类遵循广度优先的规则

1.3.2、深度优先

  • D是继承B和C的,
  • 按照顺序,首先去找B,
  • 如果在B里面能找到实例化对象,便继承B,不再往别的地方寻找
  • 如果没有,就会接着找A
  • 查找顺序为D===>B===>A===>C
    在这里插入图片描述

1.3.3、广度优先

  • D是继承B和C的,
  • 按照顺序,首先去找B,
  • 如果在B里面能找到实例化对象,便继承B,不再往别的地方寻找
  • 如果没有,就会接着找C,而不是找B的父亲A
  • 查找顺序为D===>B===>C===>A

1.3.4、经典类中深度优先的BUG

  • 经典类中如果都有save方法, C中重写了save() 方法, 那么寻找顺序是 D->B->A, 永远找不到C.save()
    在这里插入图片描述

1.3.5、查看类的继承顺序

class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

if __name__ == '__main__':
    print(D.__mro__)

输出:
(<class ‘main.D’>, <class ‘main.B’>, <class ‘main.C’>, <class ‘main.A’>, <class ‘object’>)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值