曾经我写 Python 代码几乎全是 class。但后来我发现,其实大多数时候,更简单的方式反而更高效。现在,我已经逐渐摆脱了“类强迫症”,也许你也该试试。
那时候我刚开始学编程,觉得写类很“高级”。书上也这么教,讲什么 __init__、继承、多态、封装,搞得好像不写类就不是“正经程序员”。
于是我写了很多这样的代码:
classUser:def__init__(self, name, email):self.name = nameself.email = email没错,很标准的 OOP(面向对象编程)写法。
但随着项目变大,我发现事情变得不对劲了——这些 class 不仅没帮我更好地组织代码,反而让事情变复杂了。
总结一句话就是:太多形式主义,太少实际价值。
很多时候,我只是想完成一个简单的功能,但写类会让我花大量精力去写构造函数、维护状态、搞清楚逻辑到底藏在哪个方法里。而这些复杂结构往往没必要。
更重要的是,有些时候,这种“提前抽象”反而让代码更难读、更难测、更难维护。所以我开始用这些方式替代 class。
如果一个功能不需要保留状态,那么它根本就不需要一个类。直接写函数就行了:
defsend_email(to, subject, body):# 简洁清晰pass函数比类更直观,更容易测试,也更“Pythonic”。
@dataclass 替代冗长的类有时候,我确实需要一个“只存数据”的结构,这时候用 dataclass 就很完美:
from dataclasses import dataclass@dataclassclassUser: name: str email: str你不用自己写 __init__ 和 __repr__,Python 会自动帮你生成,干净利落,非常适合做配置、数据传输对象(DTO)或者参数结构。
有些场景连 dataclass 都嫌多,比如处理 JSON、API 返回值、配置文件……用字典就行:
user = {"name": "Alice","email": "alice@example.com"}轻便灵活,适合快速开发。
如果你只是想要个全局工具或状态,写个模块就好了,没必要硬写个“单例类”。
# email_utils.pydefsend_email(to, subject, body):pass# 使用时import email_utilsemail_utils.send_email(...)没有实例化,没有层层调用,一目了然。
提前把东西封装成类,看起来“有架构”,但:
很多时候,我们只是在写脚本、数据处理、API 接口……用不着搞一堆复杂的 class。保持代码简洁、显式、易读,才是 Python 最强的地方。
我不是反对用 class,我是反对无脑用 class。
我仍然会在以下场景使用类:
但这些情况,在我日常工作中,其实很少见。
之前我写了个用于发送 Slack 消息的小工具,最初的版本是这样写的:
classSlackNotifier:def__init__(self, webhook_url):self.webhook_url = webhook_urldefsend(self, message):# 发送消息后来我把它重构成函数形式:
defsend_slack_message(webhook_url, message):# 发送消息新版本更短、更好测,也不用再费劲地创建类对象。
Python 是一门充满表达力的语言,不是每件事都需要 class。函数、模块、dataclass、dict……这些原生工具往往更轻便、更灵活。
如果你也在为项目结构发愁,不妨试着少写点 class,看看效果如何。
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等 推荐阅读
点击 阅读原文 了解更多