Python中是否存在不应将所有类都定义为dataclass的缘由?
不必要的默认方法开销:dataclass会自动生成
__init__、__repr__、__eq__等方法,但如果你的类根本不需要这些(比如纯处理业务逻辑的工具类),这些自动生成的方法不仅没用,还会平白增加内存占用和方法查找的额外开销。比如一个只用来执行特定计算的类,__repr__和__eq__完全是多余的累赘。意外的行为冲突:自动生成的方法很可能和你自定义的逻辑撞车。比如你想自己实现
__eq__来做特殊的相等判断,但dataclass默认会根据所有字段生成相等比较逻辑,要是没设置eq=False,就会直接覆盖你写的实现,导致逻辑出错。再比如__init__方法,dataclass生成的__init__是按字段顺序传参的,如果你需要自定义初始化逻辑,要么得用__post_init__补充逻辑,要么就得手动覆盖__init__,反而比普通类更麻烦。语义混淆:dataclass的核心设计目的是存储数据,用它来定义非数据类会让其他开发者误解类的用途。比如一个处理文件上传的服务类,用dataclass定义的话,别人第一反应会以为这是存储上传信息的数据结构,而不是包含业务逻辑的服务类,直接降低了代码的可读性和可维护性。
字段限制带来的不便:dataclass依赖类变量来定义字段,如果你在类里定义一些和数据存储无关的类级属性或方法,搞不好会被误识别为dataclass的字段。比如你在类里写
logger = logging.getLogger(__name__),要是没加@dataclass(init=False)或者把它标记为ClassVar,dataclass会把它当成需要初始化的字段,要么报错要么行为不符合预期。继承的复杂性:dataclass的继承规则比普通类复杂得多。比如子类继承父类dataclass时,字段合并、方法覆盖都有特殊规则,处理不好很容易出问题。而普通类的继承逻辑更直观,对于非数据类来说,用普通类继承会简单可靠得多。
内容的提问来源于stack exchange,提问作者Nikša Baldun

