28 - 面向对象的三大特征 - 继承

目录

一、继承

1、概念

2、使用场景

3、优点

二、继承的语法

三、继承的专业术语

四、继承的传递性

五、继承案例1

1、需求

2、代码实现

3、对象调用方法的顺序

六、方法的重写

1、概念

2、重写的方式

七、覆盖式重写

1、应用场景

2、实现方式

3、案例

八、扩展式重写

1、应用场景

2、实现方式

3、案例

4、super


一、继承

1、概念

  • 继承描述的是类与类之间的关系。(使用继承时要考虑类与类之间是否存在is...a的关系,不能盲目使用继承)

2、使用场景

  • 如果多个类中存在相同的代码逻辑,则可以考虑将相同逻辑的代码抽取封装到父类中,再通过继承关系,直接实例化子类对象并调用父类中的方法使用即可,进而可以避免反复编写相同逻辑的代码。

3、优点

  • 在继承关系中,子类可以拥有父类的所有方法和属性;减少冗余代码,提高编程效率。

二、继承的语法

  • 子类 继承自 父类,可以直接享受父类中已经封装好的方法,不需要再次开发。
  • 子类中应根据职责,封装子类特有的 属性和方法。

三、继承的专业术语

  • A类是B类的子类,B类是A类的父类,A类从B类继承。
  • A类是B类的派生类,B类是A类的基类,A类从B类派生。
  • 父类有时也称为:基类、超类。

四、继承的传递性

  • 子类拥有父类、以及父类的父类中封装的所有属性和方法。
  • 父类默认继承object类,object类:Python中最原始的类。
  • C类从B类继承,B类又从A类继承;那么C类就拥有B类和A类的所有属性和方法。

五、继承案例1

1、需求

  • 定义动物类,动物有姓名和年龄属性,具有吃和睡的行为
  • 定义猫类,猫类具有动物类的所有属性和方法,并且具有抓老鼠的特殊行为
  • 定义狗类,狗类具有动物类的所有属性和方法,并且具有看门的特殊行为
  • 定义哮天犬类,哮天犬类具有狗类的所有属性和方法,并且具有非得特殊行为

2、代码实现

# 1、定义动物类,动物有姓名和年龄属性,具有吃和睡的行为
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('动物吃东西')

    def sleep(self):
        print('动物在睡觉')


# 2、定义猫类,猫类具有动物类的所有属性和方法,并且具有抓老鼠的特殊行为
class Cat(Animal):
    def catch(self):
        print('猫猫抓老鼠')


# 3、定义狗类,狗类具有动物类的所有属性和方法,并且具有看门的特殊行为
class Dog(Animal):
    def look_door(self):
        print('狗狗在看门')


# 4、定义哮天犬类,哮天犬类具有狗类的所有属性和方法,并且具有飞的特殊行为
class xiaotianquan(Dog):
    def fly(self):
        print("哮天犬在飞翔")


if __name__ == '__main__':
    cat1 = Cat('黏黏', 1)
    cat1.eat()
    cat1.sleep()
    cat1.catch()

    dog1 = Dog("太子", 2)
    dog1.eat()
    dog1.sleep()
    dog1.look_door()

    xtq1 = xiaotianquan('神犬', 3)
    xtq1.eat()
    xtq1.sleep()
    xtq1.look_door()
    xtq1.fly()


'''
运行结果:
    动物吃东西
    动物在睡觉
    猫猫抓老鼠
    动物吃东西
    动物在睡觉
    狗狗在看门
    动物吃东西
    动物在睡觉
    狗狗在看门
    哮天犬在飞翔
'''

3、对象调用方法的顺序

  • 会先在自己的类中查找,找到直接使用;
  • 没有找到,去父类中查找,找到直接使用;
  • 没有找到,在父类的父类中查找,找到直接使用;
  • ......
  • 直到找到object类,找到直接使用,没找到直接报错。

六、方法的重写

1、概念

  • 当父类中的方法实现,不能满足子类需求时,可以对父类中的方法进行重写(override)。

2、重写的方式

  • 覆盖式重写
  • 扩展式重写

七、覆盖式重写

1、应用场景

  • 如果在开发中,父类的方法实现 和 子类的方法实现,完全不同,就可以使用覆盖的方式,在子类中重新编写父类的方法实现。

2、实现方式

  • 相当于在子类中,定义了一个和父类同名的方法并且实现。
  • 重写之后,在运行时,只会调用子类中重写的方法,而不会再调用父类封装的方法。

3、案例

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('动物吃东西')

# 覆盖式重写父类Animal中的eat方法
class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

if __name__ == '__main__':
    cat1 = Cat('黏黏', 1)
    cat1.eat()

'''
运行结果:
    猫吃鱼
'''

八、扩展式重写

1、应用场景

  • 如果子类中重写父类的方法时,需要包含父类中方法的实现,则可以考虑使用扩展式重写。

2、实现方式

  • 在子类中重写父类方法
  • 在子类中需要的位置,使用super().父类方法名,调用父类方法执行

3、案例

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('动物吃东西')

# 扩展式重写父类Animal中的eat方法
class Cat(Animal):
    def eat(self):
        super().eat()
        print('猫吃鱼')

if __name__ == '__main__':
    cat1 = Cat('汤姆', 2)
    cat1.eat()

'''
运行结果:
    动物吃东西
    猫吃鱼
'''

4、super

  • 在Python中super是一个特殊的类
  • super()就是使用super类创建出来的对象
  • 最常使用的场景,就是在重写父类方法时,调用在父类中封装的方法实现
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值