Skip to content

继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用 继承。一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为 父类 ,而新类称为 子类 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

继承的概念: 子类拥有父类的所有方法和属性

继承的语法

python
class 类名(父类名):
    pass

子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发

子类中应该根据职责,封装子类特有的属性和方法

子类 init 方法

创建子类的实例时,Python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法 __init__() 需要父类施以援手。

例如,下面来模拟 坦克。 坦克英雄是一种特殊的对象,因此我们可以在前面创建的 Hreo 类的基础上创建新类 Tank ,这样我们就只需为坦克特有的属性和行为编写代码。

python
class Hero(object):
    def __init__(self, name):
        self.name = name

        ...

    def hello(self):
        print(f'{self.name} 正在向你打招呼')


class TanK(Hero):
    def __init__(self, name, defence, blood):
        # self.name = name  
        # 继承了爸爸的方法与属性,同时需要承担相应的责任  
        super().__init__(name)  # super 使用 super 关键字完成继承的仪式  
        # 在完成仪式的时候,爸爸有的属性儿子需要传递给爸爸  

        self.defence = defence
        self.blood = blood


tank = TanK('坦克', 100, 1000)
# 坦克类没有 hello 方法,但是不会报错  
tank.hello()

首先是 Hero 类的代码。创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。

super() 是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Tank 调用父类的方法__init__() ,让 Tiger 实例包含父类的所有属性。父类也称为 超类 (superclass),名称 super 因此而得名。

为测试继承是否能够正确地发挥作用,我们尝试创建一个坦克对象,但提供的信息与创建英雄时相同。结果正常运行。

python
tank = Tank('坦克', 100, 1000)
tank.hello()

继承演示

实现以下内容的封装

txt
"""  
    定义动物类(Animal)一个动物类  
        属性:name、high、weight  
        方法:eat  
  
    定义老虎类(Tiger)  
        属性:name、high、weight  
        方法:eat、bark、tiger_skill  
  
    定义狮子类(Lion)  
        属性:name、high、weight  
        方法:eat、bark、lion_skill  
"""

无继承

python
class Animal(object):
    def __init__(self, name, high, weight):
        self.name = name
        self.high = high
        self.weight = weight

    def eat(self):
        print(f'{self.name} 正在吃东西')


class Tiger(object):
    def __init__(self, name, high, weight):
        self.name = name
        self.high = high
        self.weight = weight

    def eat(self):
        print(f'{self.name} 正在吃东西')

    def bark(self):
        print(f'{self.name} 正在嗷呜叫~~~')

    def tiger_skill(self):
        print(f'来自丛林之王 {self.name} 必杀技')


class Lion(object):
    def __init__(self, name, high, weight):
        self.name = name
        self.high = high
        self.weight = weight

    def eat(self):
        print(f'{self.name} 正在吃东西')

    def bark(self):
        print(f'{self.name} 正在吼吼叫~~~')

    def lion_skill(self):
        print(f'来自草原之王 {self.name} 必杀技')

有继承

python
class Animal(object):
    def __init__(self, name, high, weight):
        self.name = name
        self.high = high
        self.weight = weight

        # 动物默认吃东西的声音  

    def eat(self):
        print(f'{self.name} 正在吃东西')


class Tiger(Animal):
    def __init__(self, name, high, weight):
        # 相当于调用了父类的初始化放在,在父类的init方法中绑定 name, high, weight        
        super().__init__(name, high, weight)
    
    # def eat(self):
    #     print(f'{self.name} 正在吃东西')
    
    def bark(self):
        print(f'{self.name} 正在嗷呜叫~~~')

    def tiger_skill(self):
        print(f'来自丛林之王 {self.name} 必杀技')



class Lion(Animal):
    def __init__(self, name, high, weight):
        super().__init__(name, high, weight)
    
    # def eat(self):
    #     print(f'{self.name} 正在吃东西')
    
    def bark(self):
        print(f'{self.name} 正在吼吼叫~~~')

    def lion_skill(self):
        print(f'来自草原之王 {self.name} 必杀技')


tiger = Tiger('泰哥', 1.88, 360)
lion = Lion('辛巴', 2, 380)

tiger.eat()
# lion --> Lion 类 --> Animal 类 --> object 类 还是没有就会报错  
lion.eat()

tiger.tiger_skill()
lion.lion_skill()

tiger.bark()
lion.bark()

子类新增属性和方法

让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。

新增一个猫类,并且猫咪会多出一个颜色属性。

python
class Cat(Animal):

    def __init__(self, name, high, weight):
        super().__init__(name, high, weight)
        self.color = '银白色'

    def eat(self):
        print(self.name, '正在吃东西')

    def bark(self):
        print(self.name, '正在喵喵叫')

    def skill(self):
        print(self.name, '猫咪的必杀技')

    def info(self):
        print(f'种类:猫\t名字:{self.name}\t颜色:{self.color}\t体重:{self.weight}')


t = Cat('小猫咪', 1.9, 320)
t.eat()
t.info()

在心的类里面,我们添加了新属性 self.color ,并设置其初始值(如黄色 )。根据 Cat 类创建的所有实例都将包含这个属性,但所有 Animal 实例都不包含它。

我们还添加了一个名为 info() 的方法,它打印有猫咪的信息。我们调用这个方法时,将看到一条猫咪类特有的描述。

案例-动物类继承

txt
"""
小蛇修炼记
    蛇  -->  蛟  --> 龙

蛇 snake    
    属性:
        name
        color(颜色)
        length(长度)
        size(粗细)
    行为:     
        run(游走)

蛟 Jiao
    属性:
        name
        color(颜色)
        length(长度)
        size(粗细)
        claw(爪子)
        corner(角)
    行为:run(游走),fly(飞行)

龙 Dragon
    属性:
        name
        color(颜色)
        length(长度)
        size(粗细)
        claw(爪子)
        corner(角)
    行为:
        run(游走)
        fly(飞行)
        skill(技能)
"""
python
class Snake(object):
    def __init__(self, name, color, length, size):
        self.name = name
        self.color = color
        self.length = length
        self.size = size

    def run(self):
        return f'{self.name} 正在跑路....'


# alt + shift + 鼠标左键
# ctrl + shift + ->
class Jiao(Snake):
    def __init__(self, name, color, length, size, claw, corner):
        super(Jiao, self).__init__(name, color, length, size)
        self.claw = claw
        self.corner = corner

    def fly(self):
        return f'{self.name} 正在腾云驾雾'


class Dragon(Jiao):

    def skill(self):
        return f'{self.name} 正在施云布雨'


snake = Snake('小花蛇', '斑纹', '50 cm', '5 cm')
print(snake.run())

jiao = Jiao('小花蛟', '斑纹', '250 cm', '50 cm', 2, 1)
print(jiao.fly())

long = Dragon('小金龙', '金色', '2500 cm', '250 cm', 5, 2)
print(long.skill())