面向对象之继承

Hqqqq / 2024-01-14 / 原文

【一】什么是继承

  • 新建的类可以继承一个或多个父类,
  • 子类有所有父类有点数据属性和函数属性
  • python中继承被分为单继承和多继承

【二】单继承和多继承

# 定义父类
class Human:
    ...


# 定义父类
class Asia:
    ...


# 单继承
class Chinese(Human):
    ...


# 多继承
class Shanghai(Human, Asia):
    ...

【三】查看继承

class Human:
    ...


# 定义父类
class Asia:
    ...


# 单继承
class Chinese(Human):
    ...


# 多继承
class Shanghai(Asia, Human):
    ...

# __base__只查看从左到右继承的第一个子类,
# __bases__则是查看所有继承的父类
print(Shanghai.__base__)  # <class '__main__.Asia'>
print(Shanghai.__bases__)  # (<class '__main__.Asia'>, <class '__main__.Human'>)

【四】经典类和新式类

  • 只有在python2中才分新式类和经典类

  • 在python2中,没有显示的继承object类的类,以及该类的子类,都是经典类

  • 在python2中,显示的声名继承object的类,以及该类的子类才是新式类

  • 在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

  • 如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

class Human:
    ...
print(Human.__bases__) # (<class 'object'>,)

【五】继承与抽象(先抽象再继承)

  • 对于生活而言都是有了各种实例才会抽象出类,比如有很多人,所以我们是人类,有很多狗,它们都属于狗类。
  • 但是对于程序而言,是要先抽象出来一个类,才能继承它的属性

【六】继承与重用性

【1】单独成类

  • 不管是哪国人都会可以会 唱 跳 rap 篮球
class Chinese(Human):
    def sing(self):
        ...

    def jump(self):
        ...
    
    def rap(self):
        ...
    
    def basketball(self):
        ...


class Korean(Human):
    def sing(self):
        ...

    def jump(self):
        ...

    def rap(self):
        ...

    def basketball(self):
        ...


class Japanese(Human):
    def sing(self):
        ...

    def jump(self):
        ...

    def rap(self):
        ...

    def basketball(self):
        ...

【2】继承总类

  • 上面可以看出哪国人都会可以会 唱 跳 rap 篮球
  • 而我们却重复了好几遍代码,出现了代码冗余
  • 如果使用继承的思想
    • 人类:唱 跳 rap 篮球
    • 中国人 说中国话 (人类的功能)
    • 韩国人 说韩国话 (人类的功能)
    • 日本人 说日本话 (人类的功能)

【3】代码实现

class Human:
    def __init__(self, name):
        self.name = name

    def sing(self):
        print(f'{self.name}会唱歌')

    def jump(self):
        print(f'{self.name}会跳舞')

    def rap(self):
        print(f'{self.name}会rap')

    def basketball(self):
        print(f'{self.name}会打篮球')


class Chinese(Human):
    ...


class Korean(Human):
    ...


class Japanese(Human):
    ...


chinese_1 = Chinese(name='IKUN')
chinese_1.jump()