Python 类的组合与继承:代码世界的“血缘”与“联姻
文章目录
前言
上回我们讲了面向对象的基础——类是什么、对象怎么造、__init__ 怎么用。
今天我们来聊两个更深入的概念:继承 和 组合。
简单来说:
继承 是“父子关系” —— 儿子继承老子的家产,还能自己添点新东西。
组合 是“合伙关系” —— 你开一家公司,雇了厨师、会计、保洁,各干各的,一起把事办了。
继承解决的是 “我是谁” 的问题(我从哪里来),组合解决的是 “我有谁” 的问题(我带了谁来)。
两个概念搞懂了,你的代码就不再是“一堆类”,而是一个有血有肉、有家族谱系、有协作网络的系统。
start show !🧬
提示:以下是本篇文章正文内容,下面案例可供参考
第一部分:继承 —— 代码世界的“父子关系”
1.1 继承是啥?
继承 就是创建一个新类(子类)时,直接拿一个已有的类(父类)的属性和方法过来用,子类还能加自己的新东西。
打个比方:
父类 = 一台基础款手机:能打电话、发短信
子类 = 智能手机:继承了打电话、发短信,还加了拍照、刷视频、打游戏
子类不用从头写一遍基础功能,直接拿父类的来用,省时省力。
1.2 继承的基本写法
python
# 父类(基类)
class Phone:
def __init__(self, brand):
self.brand = brand
def call(self):
print(f"{self.brand} 正在打电话...")
def send_sms(self):
print(f"{self.brand} 正在发短信...")
# 子类(派生类)—— 继承 Phone
class SmartPhone(Phone): # 括号里写父类名
def take_photo(self):
print(f"{self.brand} 正在拍照,咔嚓!")
def play_game(self):
print(f"{self.brand} 正在打游戏...")
# 使用
p1 = SmartPhone("华为")
p1.call() # ✅ 来自父类:华为 正在打电话...
p1.take_photo() # ✅ 自己的新功能:华为 正在拍照,咔嚓!
📌 子类 SmartPhone 没有写
__init__,也没写call(),但它自动拥有了父类的所有属性和方法。
1.3 父类和子类的关系
python
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name} 正在吃东西")
class Dog(Animal):
def bark(self):
print(f"{self.name} 汪汪叫!")
class Cat(Animal):
def meow(self):
print(f"{self.name} 喵喵叫!")
# 创建实例
dog = Dog("旺财")
cat = Cat("咪咪")
dog.eat() # 旺财 正在吃东西(继承自 Animal)
dog.bark() # 旺财 汪汪叫!(自己的)
cat.eat() # 咪咪 正在吃东西(继承自 Animal)
cat.meow() # 咪咪 喵喵叫!(自己的)
1.4 方法重写 —— 子类不满意,可以“自己来”
子类对父类的方法不满意?直接重新写一个同名的,就覆盖掉了:
python
class Animal:
def speak(self):
print("动物发出了声音")
class Dog(Animal):
def speak(self): # 重写父类的 speak
print("汪汪!")
class Cat(Animal):
def speak(self): # 重写父类的 speak
print("喵喵~")
dog = Dog()
cat = Cat()
dog.speak() # 汪汪!
cat.speak() # 喵喵~
1.5 super() —— 既要子类自己的,也要父类的
有时候你想在子类里给父类的方法“加点料”,而不是完全覆盖:
python
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
class Dog(Animal):
def __init__(self, name, age, breed):
# 先调用父类的 __init__ 处理 name 和 age
super().__init__(name, age)
# 再处理自己的新属性
self.breed = breed
dog = Dog("旺财", 3, "金毛")
print(dog.name) # 旺财(父类处理的)
print(dog.age) # 3(父类处理的)
print(dog.breed) # 金毛(自己的)
📌
super()就是“叫一声老爸”——把父类的方法拉过来先用,不够的再自己加。
1.6 继承核心总结
| 概念 | 说明 |
|---|---|
| 父类 | 被继承的类,也叫基类 |
| 子类 | 继承父类的类,也叫派生类 |
| 继承语法 | class 子类(父类): |
| 方法重写 | 子类重新定义父类的方法 |
| super() | 调用父类的方法 |
第二部分:组合 —— 代码世界的“合伙关系”
2.1 组合是啥?
组合就是一个类把另一个类的实例当作自己的属性。
继承是“我是谁”(Dog 是 Animal),组合是“我有谁”(Computer 有 CPU、有 Disk)。
打个比方:你组装一台电脑。
CPU、内存、硬盘……每个部件都是一个独立的类
电脑类不继承它们,而是把它们装进自己内部
电脑能干什么是靠这些部件协作完成的
继承是“血缘”,组合是“联姻”。
2.2 组合的基本写法
python
class CPU:
def run(self):
print("CPU 正在处理数据...")
class Memory:
def load(self):
print("内存正在加载数据...")
class Disk:
def read(self):
print("硬盘正在读取数据...")
class Computer:
def __init__(self):
# 组合:把其他类的实例变成自己的部件
self.cpu = CPU()
self.memory = Memory()
self.disk = Disk()
def start(self):
self.disk.read()
self.memory.load()
self.cpu.run()
print("电脑启动完成!")
# 使用
my_pc = Computer()
my_pc.start()
输出:
text
硬盘正在读取数据... 内存正在加载数据... CPU 正在处理数据... 电脑启动完成!
2.3 继承 vs 组合 —— 什么时候用谁?
继承:适用于 “是什么” 的关系。
狗是动物 → class Dog(Animal)
智能手机是手机 → class SmartPhone(Phone)
组合:适用于 “有什么” 的关系。
电脑有 CPU → Computer 里放一个 CPU 实例
汽车有引擎 → Car 里放一个 Engine 实例
学生有书包 → Student 里放一个 Bag 实例
python
# 继承:Dog IS-A Animal(狗是动物)
class Dog(Animal):
pass
# 组合:Dog HAS-A Tail(狗有尾巴)
class Dog:
def __init__(self):
self.tail = Tail()
2.4 组合更灵活,继承更省事
| 维度 | 继承 | 组合 |
|---|---|---|
| 关系 | 父子关系(is-a) | 拥有关系(has-a) |
| 代码复用 | 自动获得父类所有属性和方法 | 需要手动调用 |
| 耦合度 | 高(子类依赖父类) | 低(部件可独立更换) |
| 灵活性 | 差(绑死了继承链) | 好(部件随意换) |
| 适用场景 | 天然有层次关系 | 模块化组装 |
总结
🎯 继承 vs 组合 一张图总结
text
继承 组合
Animal Engine
吃 睡 启动
继承 拥有
↓ ↓
Dog Car
汪汪 行驶
Dog IS-A Animal Car HAS-A Engine
(狗是动物) (汽车有引擎)
今天你学到了两样新东西:
继承 —— 解决“我是谁”。儿子继承老爸,少写重复代码,还能自己添新功能。适合有天然层次关系的场景。
组合 —— 解决“我有谁”。就像拼乐高,每个部件独立,想怎么拼就怎么拼。适合模块化组装的场景。
这两种关系不是二选一,而是配合着用:
你的 Dog 类继承了 Animal(继承)
你的 Dog 类里有一个 Tail 实例(组合)
用了继承,代码有了“家族树”;用了组合,代码有了“朋友圈”。两个加在一起,你的面向对象才算真正成型。
更多推荐



所有评论(0)