Python 进阶 - 第十四节


📋 本节要点

知识点 说明
封装 将数据和行为打包在类内部
继承 子类继承父类的属性和方法
super() 调用父类的方法
方法重写 子类覆盖父类的方法
多态 不同对象调用相同方法有不同结果
多继承 一个类继承多个父类

0. 三大特性概述

面向对象编程(OOP)有三大特性:封装、继承、多态。封装已在前一节介绍,本节重点学习继承和多态。


1. 继承

继承允许子类自动拥有父类的属性和方法,实现代码复用,无需重复编写相同逻辑。

class 父类:
    # 属性和方法
    ...

class 子类(父类):
    # 继承父类,可以添加自己的属性和方法
    ...

1.1 基本继承

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

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

    def sleep(self):
        print(f"{self.name} 正在睡觉")

# Cat 继承 Animal(直接继承,不添加新内容)
class Cat(Animal):
    pass

cat = Cat("咪咪")
print(cat.name)   # 咪咪(继承的属性)
cat.eat()         # 咪咪 正在吃东西(继承的方法)
cat.sleep()       # 咪咪 正在睡觉(继承的方法)

# Dog 继承 Animal(扩展功能,添加新方法)
class Dog(Animal):
    def bark(self):
        print(f"{self.name} 汪汪叫")

dog = Dog("旺财")
dog.eat()    # 继承自 Animal
dog.sleep()  # 继承自 Animal
dog.bark()   # 子类自己的方法

2. 方法重写

方法重写是指子类可以覆盖父类中已有的方法,改变其行为。

class Animal:
    def sound(self):
        print("动物发出声音")

class Dog(Animal):
    def sound(self):  # 重写父类的方法
        print("汪汪叫")

class Cat(Animal):
    def sound(self):  # 重写父类的方法
        print("喵喵叫")

dog = Dog()
cat = Cat()

dog.sound()  # 汪汪叫
cat.sound()  # 喵喵叫

3. super() 调用父类方法

super() 用于在子类中调用父类的方法,常用于在子类的 __init__ 中复用父类的初始化逻辑。

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

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

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 调用父类的 __init__
        self.breed = breed      # 添加子类自己的属性

    def bark(self):
        print(f"{self.name} 汪汪叫")

dog = Dog("旺财", "哈士奇")
print(dog.name, dog.breed)  # 旺财 哈士奇
dog.eat()                   # 旺财 正在吃东西
dog.bark()                  # 旺财 汪汪叫

4. 多态

多态指不同对象对同一消息(方法调用)做出不同的响应。多态的实现前提是继承和方法重写。

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print("汪汪汪")

class Cat(Animal):
    def speak(self):
        print("喵喵喵")

class Duck(Animal):
    def speak(self):
        print("嘎嘎嘎")

# 多态:统一调用,不同的结果
def make_speak(animal):
    animal.speak()

make_speak(Dog())   # 汪汪汪
make_speak(Cat())   # 喵喵喵
make_speak(Duck())  # 嘎嘎嘎

多态的实际意义:可以不对 make_speak() 函数进行修改,增加新的 Animal 子类后就能直接运行,体现了开闭原则(对扩展开放,对修改关闭)。


5. 多继承

一个类可以继承多个父类,获得所有父类的功能。

class Flyable:
    def fly(self):
        print("可以飞")

class Swimming:
    def swim(self):
        print("可以游泳")

class Duck(Flyable, Swimming):
    def speak(self):
        print("嘎嘎嘎")

duck = Duck()
duck.speak()  # 嘎嘎嘎
duck.fly()    # 可以飞
duck.swim()   # 可以游泳

三大特性总结:
① 封装:将数据和行为打包在类内部,隐藏实现细节
② 继承:子类继承父类的属性和方法,实现代码复用
③ 多态:不同对象对同一方法有不同的实现,提高代码灵活性


下一节预告:访问限制