Python学习之路(十一)类的继承、重写、抽象类等

在 Python 中,类的 继承(Inheritance)重写(Overriding)抽象类(Abstract Base Class, ABC) 是面向对象编程(OOP)的重要特性。老生常谈的东西,面向对象都有的,基本概念和其他基本一样,写法上需要注意,并附上示例代码。


一、继承(Inheritance)

定义

继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。

示例

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

    def speak(self):
        print("动物发出声音")

class Dog(Animal):  # 继承 Animal 类
    pass

# 使用
dog = Dog("旺财")
print(dog.name)     # 输出: 旺财
dog.speak()         # 输出: 动物发出声音

二、重写(Overriding)

定义

子类可以重新定义从父类继承的方法,实现不同的行为。

示例

class Cat(Animal):
    def speak(self):  # 重写 speak 方法
        print(f"{self.name} 喵喵叫")

# 使用
cat = Cat("咪咪")
cat.speak()  # 输出: 咪咪 喵喵叫

三、调用父类方法:super()

有时你希望保留父类的功能,再添加自己的扩展,这时可以使用 super()

示例

class Bird(Animal):
    def speak(self):
        super().speak()  # 调用父类方法
        print(f"{self.name} 叽叽喳喳地叫")

# 使用
bird = Bird("小鸟")
bird.speak()

# 输出:
# 动物发出声音
# 小鸟 叽叽喳喳地叫

四、抽象类与抽象方法(Abstract Base Class)

Python 中通过 abc 模块支持抽象基类(Abstract Base Class),用于定义接口。

抽象类特点:

  • 不能直接实例化
  • 必须包含至少一个抽象方法
  • 子类必须实现抽象方法才能被实例化

示例

from abc import ABC, abstractmethod

class Animal(ABC):  # 抽象类
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def speak(self):
        pass  # 抽象方法不需要具体实现

class Cow(Animal):
    def speak(self):
        print(f"{self.name} 哞哞叫")

# 使用
cow = Cow("大花牛")
cow.speak()  # 输出: 大花牛 哞哞叫

错误示例(未实现抽象方法)

class Duck(Animal):  # 没有实现 speak()
    pass

duck = Duck("唐老鸭")  #  TypeError: Can't instantiate abstract class

五、多重继承(Multiple Inheritance)

一个类可以继承多个父类。

示例

class Flyable:
    def fly(self):
        print("飞起来啦!")

class Swimmable:
    def swim(self):
        print("游起来啦!")

class Duck(Animal, Flyable, Swimmable):  # 多重继承
    def speak(self):
        print("嘎嘎叫")

# 使用
donald = Duck("唐老鸭")
donald.speak()  # 输出: 嘎嘎叫
donald.fly()    # 输出: 飞起来啦!
donald.swim()   # 输出: 游起来啦!

六、类继承结构图(UML 风格示意)

       Animal
      /   |   \
    Dog  Cat  Bird
            \
           Cow

七、总结

特性描述
继承子类继承父类的属性和方法
重写子类可重写父类方法,实现不同逻辑
super()调用父类方法,保留原有功能
抽象类使用 @abstractmethod 定义接口,强制子类实现
多重继承一个类可以继承多个父类,注意方法解析顺序 MRO
实例化限制抽象类不能直接实例化

进阶技巧(可选)

1. 查看方法解析顺序(MRO)

print(Duck.__mro__)
# 或
Duck.mro()

2. 抽象类 + 属性验证

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

r = Rectangle(3, 4)
print(r.area())  # 输出: 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉可乐荷包蛋

努力写有用的code

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值