类继承不是万能钥匙,但用对地方确实省力又清晰。它最实在的作用,是让代码里那些‘差不多但又有点不一样’的功能,不用反复抄、也不用堆条件判断。
复用通用行为
比如做一套用户系统:管理员、普通用户、VIP 用户,都有登录、改密码、查看资料这些动作。把这些共性抽成一个 User 基类,子类直接继承,不用每个类都重写一遍登录逻辑。
class User:
def login(self):
print("执行统一登录验证")
class Admin(User):
def delete_post(self):
print("删除文章")
class VipUser(User):
def get_vip_service(self):
print("开通专属服务")这样改登录规则时,只动基类,所有子类自动生效。
统一接口,差异化实现
不同支付方式(微信、支付宝、银行卡)都要走“下单→扣款→返回结果”流程,但每步细节不同。用继承定义统一方法名,子类各自实现内部逻辑,上层调用完全不用关心是哪种支付。
class Payment:
def pay(self, amount):
self.validate()
self.deduct(amount)
return self.confirm()
class WechatPay(Payment):
def deduct(self, amount):
print(f"微信扣款 {amount} 元")
class Alipay(Payment):
def deduct(self, amount):
print(f"支付宝扣款 {amount} 元")业务层只要 pay_obj.pay(99),就能跑通整条链路。
构建层级化对象模型
网络请求库中,Request 是基础概念,而 GetRequest、PostRequest、UploadRequest 各自扩展字段和校验逻辑。继承天然适合表达这种“大类→小类”的关系,结构一目了然,加新类型也方便——照着模板新建个子类,补上特有字段就行。
配合多态做灵活替换
一个日志模块支持输出到文件、控制台、远程服务器。定义 Logger 基类,三个子类分别实现 write() 方法。主程序只认 Logger 类型,运行时传哪个实例,就走哪条输出路径——换渠道不用改业务代码,只换对象。
继承不适合硬套所有场景。比如两个类只是偶尔有相似方法,或者关系不满足“is-a”(例如“汽车”和“轮胎”不是“轮胎是一种汽车”),强行继承反而让代码变僵硬。这时候组合、协议或简单函数可能更轻快。