如何在Python面向对象编程中避免高耦合的上帝类设计

酷瑶大大_7908

酷瑶大大_7908

2026-09-07

876人浏览

原创

上帝类从__init__初始化多个职责对象起就已形成;识别信号包括:多依赖初始化、方法名混用动词前缀、单元测试需mock多个外部依赖;拆分应遵循grasp信息专家原则,按数据归属分配职责,并通过依赖注入解耦。

如何在python面向对象编程中避免高耦合的上帝类设计

直接说结论:上帝类不是写多了才出现的,而是从第一行 __init__ 开始就埋了雷——只要一个类同时承担“存数据、做计算、发通知、写日志、校验权限”,它就已经是上帝类了。

识别上帝类的三个信号

不用等代码长到1000行,这几个现象一出现,基本就能判定:

  • self.users、self.email_service、self.logger、self.validator 全在一个 __init__ 里初始化
  • 方法名混着用动词前缀:send_email、validate_user、log_action、export_csv
  • 单元测试必须 mock 至少4个外部依赖才能跑通一个方法

拆分时优先按“信息专家”原则分配职责

GRASP 的 信息专家 原则比“高内聚低耦合”更具体:谁持有数据,谁就该处理跟那数据最直接相关的逻辑。别凭感觉分,看字段归属。

Python Testing
Python Testing

Python 测试速查:运行 pytest、使用 mock/patch、参数化、fixtures、异步、覆盖率测试。

下载
  • 如果类里有 self.balance 和 self.currency,那 calculate_interest 就该归它;但 send_sms_alert 不该——短信服务不持有余额信息
  • 如果 User 类里存了 self.role,权限检查逻辑可以留;但 generate_monthly_report 不该——报表需要聚合N个用户,不是单个用户的“信息”
  • 遇到“这个功能该放哪儿”,先问:当前类有没有这个操作所需的全部数据?没有,就往外推,推给能拿到那些数据的协作方

用依赖注入代替内部创建,切断隐式耦合

上帝类常偷偷 new 出其他对象,比如在 process_order 里直接调用 EmailService() 或 DBConnection()。这会让测试和替换实现变得极难。

  • 把外部依赖作为参数传进 __init__ 或方法,而不是在内部用 import + () 创建
  • 接口要窄:不要传整个 Database 实例,只传需要的 save_user 函数或 Repository 接口
  • 避免 if config.mode == 'prod': use_real_email() else: use_stub() 这种分支——那是配置逻辑,不该污染业务类

警惕“组合”变成新上帝类的温床

有人把上帝类拆成 UserManager + EmailSender + Logger,然后让 UserManager 持有后两者实例——这没解决问题,只是把上帝类换了个名字。关键不在拆,而在“谁控制谁”。

真正解耦的标志是:User 类完全不知道 EmailSender 的存在;EmailSender 只接受原始数据(如 user.email、template_name),不碰 User 对象本身。中间那层协调逻辑,应该放在用例层(比如 RegisterUserUseCase),而不是塞进某个实体类里。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1591

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3804

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1589

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

21917

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2687

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2747

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1103

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2123

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程