面向对象进阶
# 面向对象进阶
## 继承
继承:子类复用父类的属性和方法,支持多级继承和多重继承。
```python
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("子类必须实现 speak 方法")
class Dog(Animal):
def speak(self):
return f"{self.name}:汪!"
class Cat(Animal):
def speak(self):
return f"{self.name}:喵~"
class GuideDog(Dog):
def guide(self):
return f"{self.name}正在引路"
```
### 多继承
```python
class A: pass
class B: pass
class C(A, B): pass # 多继承
```
> **注意**:多重继承时,方法解析顺序(MRO)遵循 C3 线性化算法。
## super() 调用父类方法
```python
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # 调用父类 __init__
self.breed = breed # 子类新增属性
def speak(self):
return f"{self.name} ({self.breed}):汪!"
```
## 多态
不同对象对同一消息做出不同响应的能力。
```python
def make_speak(animal):
print(animal.speak())
dog = Dog('旺财', '金毛')
cat = Cat('咪咪')
make_speak(dog) # 旺财 (金毛):汪!
make_speak(cat) # 咪咪:喵~
```
## 抽象类与抽象方法
抽象类不能直接实例化,子类必须实现抽象方法。
```python
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return 3.14159 * self.r ** 2
def perimeter(self):
return 2 * 3.14159 * self.r
```
## 总结
- 继承复用父类代码,支持多级和多重继承
- `super()` 调用父类构造器和方法
- 抽象类(ABC)强制子类实现抽象方法
- 多态:同一接口,不同实现