在 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