Python魔法方法是否允许返回与操作数类型不同的结果?
问题解答
1. 语法层面是否允许?
Python没有对魔法方法的返回值类型做强制约束,你给出的示例代码是完全合法的,运行后可以正常得到你想要的字符串结果,不会触发语法或运行层面的报错。
2. 是否是展示实例差异的可行方式?
- 功能层面:如果仅要实现「两个User实例相减返回差异描述」的需求,这么写确实可以跑通,属于满足需求的实现。
- 工程实践层面:非常不推荐这么写,原因如下:
- 违反了通用的运算符语义约定:所有开发者对
-运算符的固有认知是「执行减法操作,返回和操作数同类型的结果」,突然返回字符串会严重降低代码可读性,违反最小惊讶原则,给后续维护代码的其他开发者带来困扰。 - 拓展性差:如果后续需要同时返回多个字段的差异、或者需要对差异结果做进一步逻辑处理,字符串类型很难满足后续的拓展需求。
- 违反了通用的运算符语义约定:所有开发者对
更推荐的实现方式
你可以单独实现一个diff方法来做差异对比,语义更清晰:
def diff(self, other): if other.__user_name != self.__user_name: return "User name changed from {} to {}".format(self.__user_name, other.__user_name) return "" # 调用方式 user_diff = user_1.diff(user_2)
如果确实想用运算符实现,也可以让__sub__返回一个自定义的差异对象,需要字符串展示的时候再做类型转换,兼顾运算符习惯和可读性。
内容的提问来源于stack exchange,提问作者NNikN
相关产品推荐
相关产品推荐

