python 0基础 第十五节 继承与多态

一.继承

1.什么是继承

  • 继承就是为了解决两个有大量重复性代码的类。 抽象出一个更抽象的类放公共代码。
  • 其意义是重用代码,方便代码的管理与修改
  • 类的继承包括属性和方法

2.继承关系

  1. object — 顶级父类
    • 若类没有任何继承,他的父类就是object
  2. 子承父业
class Father(object):
    def __init__(self, name):
        self.name = name

    def fun(self):
        print('父类中方法被调用')


class Son(Father):
    # 当字类与父类拥有同名方法时,会重构此方法
    def __init__(self, name):
        self.name = 'son'


f = Father('父类')
s = Son('子类')
print(Father.__base__)  # 查看Father的父类
print(Son.__bases__)  # 查看Son的父类
s.fun()  # 字类调用父类方法
print(s.name)  # 与父类存在同名方法,重构方法

在这里插入图片描述

3.继承搜索

  • 在上面我们可以看见,继承情况下, 访问类的属性以及方法时,其搜索顺序
  • 访问类的属性以及方法 — 类 ---- 直接基类(父类) ---- 间接基类 (父类的父类)
  • 在这里插入图片描述

二 .多继承

1.多继承首先需要明白继承时的顺序

class Base(object):
    def __init__(self, name):
        rint('Base类初始化函数被调用')

    def fun(self):
        print('Base类中fun方法被调用')


class A(Base):
    def __init__(self):
        print('Base子类A初始化方法被调用')


class B(Base):
    def __init__(self):
        print('Base子类B初始化方法被调用')


class C(A, B):
    def __init__(self):
        print('A,B的子类C初始化方法被调用')


test1 = C()
print(test1)
print(C.__bases__)
print(C.__mro__)  # 查找顺序
# 继承优先前面,也就是先看A,然后看B,再看Base,最后看object

在这里插入图片描述

2.继承-重构

  1. 当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来进行覆盖
    例如上图初始化方法

3.继承-重构延用

  1. 解决重构之后又需要调用

方法一:super() ----

  • super指定继承需要有继承关联

  • super(): 是用于调用父类的一个方法,遵循就近原则

  • super()是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
    在这里插入图片描述

方法二:指定性(重点)

  • 在继承范围内进行指定性调用
    在这里插入图片描述

三.多继承中的私有性问题

  • 私有属性可以被继承
  • 私有属性不可被直接访问
  • 可以通过父类方法返回值来得到父类的私有属性
    在这里插入图片描述

四.多态

  1. 在不同类中定义不同功能的函数时使用相同的函数名,可以实现一个函数名调用多种功能

  2. 多态的特点

  • 只需要对象的实例方法同名不需要对象所属的类型相同。
  • 对象所属的类不一定要有继承关系。
  • 多态可以增加代码的外部调用灵活度,增加代码通用性,提高兼容性
  • 多态是调用方法的技巧,在类做内部设计时不受影响。

1.对象所属类无继承关系时的多态

class Aircraft(object):  # 飞机类
    def move(self):
        print('飞机move')


class Car(object):  # 汽车类
    def move(self):
        print('汽车move')


class train(object):
    def move(selfd):
        print('火车move')


def move1(obj):  # 实现移动的功能函数
    obj.move()


air = Aircraft()
car = Car()
tra = train()

move1(tra)
tra.move()

在这里插入图片描述

2. 对象所属类有继承关系时的多态

class Animal(object):
    def __init__(self):
        pass
    def eat(self):
        print('进食')


class Dog(Animal):
    def eat(self):
        print('此时在Dog类中已重写父类的eat方法')
        print('吃骨头')


class Cat(Animal):
    def eat(self):
        print('此时在Cat类中已重写父类的eat方法')
        print('吃鱼')


def eat(obj):
    obj.eat()


animal = Animal()
eat(animal)  # Animal中的方法

dog = Dog()
eat(dog)

cat = Cat()
eat(cat)

在这里插入图片描述

3.对象信息

  • 在python中判断对象类型,都是使用type()函数。
  • 如果一个变量指向函数或者类也可以使用type(),但是type()返回函数类型是需要if语句取判断的。
  • 对于class思维继承关系来说使用type很不方便,因此判断class的类型就要去使用isinstance()函数
    在这里插入图片描述

在这里插入图片描述

  • 此时cat没有继承animal,也不是animal类,故返回值为false
  • 方便用于条件判断,来判断对象是否为某种类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值