【发布时间】:2017-04-12 06:55:30
【问题描述】:
我有一个带有重载比较运算符的 int 派生类。
在重载方法的主体中,我需要使用原始运算符。
玩具示例:
>>> class Derived(int):
... def __eq__(self, other):
... return super(Derived, self).__eq__(other)
在 Python 3.3+ 上运行良好,但在 Python 2.7 上失败,异常 AttributeError: 'super' object has no attribute '__eq__'。
我可以考虑几个步行区,我发现它们不是很干净:
return int(self) == other
需要创建一个新的 int 对象来比较它,而
try:
return super(Derived, self).__eq__(other)
except AttributeError:
return super(Derived, self).__cmp__(other) == 0
根据 Python 版本拆分控制流,我觉得这非常混乱(明确检查 Python 版本也是如此)。
如何在 Python 2.7 和 3.3+ 中以优雅的方式访问原始整数比较?
【问题讨论】:
-
您可以通过
super.__eq__访问int比较方法。但是,根据 python 版本,内置类型比较方法的实现有很大不同。因此 python2super.eq需要 1 个参数(其他),而 python3 需要 2 个(自我和其他) -
你觉得
int(self) == int(other)太乱了吗? -
@Phillip 它比
int(self) == other多了一个对象 -
@abukaj 啊,你已经考虑过了。对不起。我不认为你假设的开销是真实的。对于任何 Python 实现来说,如果不优化内置整数类型,那就太疯狂了,例如,really 每次你在某个地方有一个整数时都会实例化一个完整的对象。 (也就是说,在继续担心这种优化之前,我会做一些基准测试。)
标签: python python-2.7 inheritance operator-overloading comparison-operators