为什么我不再盲目使用 Python 类了?
这些年,我一直用基于类的风格写 Python,后来才发现:其实很多时候,用更简单的工具反而更合适。下面我来分享我的转变过程,说不定你也会有同感。
曾经有段时间,我几乎把所有代码都用类来写。
总觉得这样才显得“专业”。毕竟,面向对象编程(OOP)一直被奉为金标准,对吧?
但在实际开发过 API、自动化脚本和数据流水线之后,我逐渐意识到:大多数情况下,我其实并不那么需要类。
甚至在很多项目中,类反而让我的开发效率变低了。
为什么我们曾如此迷恋类?
很多人初学编程时就被灌输:类是写出清晰、可扩展代码的基础。
我们学会了 __init__、继承、封装……没过多久,就开始为每一个小功能构建复杂的类层次结构。
我以前也这样。代码里到处是这样的模板:
classUser:
def__init__(self, name, email):
self.name = name
self.email = email
但随着项目越来越大,我渐渐感觉到不对劲。
类引入了太多“仪式感”,让本来简单的代码变得复杂。
更糟糕的是,它们有时反而把逻辑隐藏在过度抽象的背后。
那我后来用了什么替代方案?
首先,优先考虑函数
如果一个功能不需要在多次调用之间保持状态,那它根本不需要类。
我现在默认都写普通函数,比如:
defsend_email(to, subject, body):
# 简单明了,一目了然
pass
这样的代码读起来、测试起来、维护起来都更快。
数据类(dataclass),替代传统的类
如果我只需要保存数据,Python 的 @dataclass 是一个非常优雅的解决方案:
from dataclasses import dataclass
@dataclass
classUser:
name: str
email: str
它优点很明显:
代码更简洁 自动生成 __init__、__repr__等方法保持轻量且可读性强
我现在常用 dataclass 来表示数据传输对象(DTO)、配置或结构化参数。
字典:轻量级的状态保存方式
有时候,我甚至连数据类都不需要,一个普通的字典就足够了:
user = {
"name": "Alice",
"email": "[email protected]"
}
尤其在处理 JSON、API 响应或配置时,字典特别方便。
用模块实现单例模式
如果想在多个地方共享状态或工具方法,直接写一个模块就好——根本没必要特意写一个“单例类”。
比方说,创建一个 email_utils.py:
# email_utils.py
defsend_email(to, subject, body):
pass
# 其它地方直接引入使用
import email_utils
email_utils.send_email(...)
没有类的负担,不需要实例化——清晰而扁平化的代码,舒服。
警惕“过早抽象”带来的问题
说到底,类最大的问题在于:
它们常常在我们真正需要抽象之前,就强行引入了抽象。
这会导致你的代码:
更难测试(“我应该模拟这个类还是方法?”) 更啰嗦 不够“Pythonic”——不符合 Python 简洁明了的哲学
我现在越来越倾向于利用 Python 本身的优势——简单、可读性强、直白——这样写出来的代码反而更健壮。
在很多脚本、微服务或 ETL 任务中,类其实是一种过度设计。
那我什么时候还会用类?
当然,我并不是说类就一无是处。
我只是反对不假思索地默认使用类。
下面这些情况,我仍然会使用类:
需要继承或多态时 开发图形界面或游戏(比如用 PyQt 或 Pygame) 使用某些要求类结构的框架(如 Django 或 FastAPI) 对象有频繁变化的状态+丰富的行为
但在日常绝大多数工作中——尤其是写函数、脚本或API——这类情况其实非常少见。
来看一个实际案例:告别类的改造过程
之前我写过一个脚本,负责根据 CI 事件发送 Slack 通知。
之前的写法(基于类):
classSlackNotifier:
def__init__(self, webhook_url):
self.webhook_url = webhook_url
defsend(self, message):
# 发送消息到 Slack
改造后(基于函数):
defsend_slack_message(webhook_url, message):
# 直接发送消息,无需实例化
新的版本更短、更容易测试,不用先实例化对象再调方法——一步到位。
最后一点想法
Python 提供了这么多灵活的工具,我们真的不必每次都硬套类。
下次写代码前,不妨先问自己一句:
这个功能真的必须用类来实现吗?
如果答案是否定的,那就试试更简单的方式。
以后的你(和你的同事)会感谢这个决定的。
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递