在Python中比较不同类型

4 投票
2 回答
572 浏览
提问于 2025-04-15 13:07

首先是代码:

class myClass(object):
    def __cmp__(self, other):
        return cmp(type(self), type(other)) or cmp(self.__something, other.__something)

这段代码的排序方式和Python中其他类型的排序方式一样吗?有没有什么正确的方法来处理这个问题?

相关问题:

我在谷歌上查了一下,发现了一些相关的信息在Python文档中。引用如下:

实现说明:不同类型的对象(除了数字)是根据它们的类型名称进行排序的;同一类型但不支持正常比较的对象是根据它们的地址进行排序的。

这说明如果我想遵循这种行为,我应该使用

class myClass(object):
    def __cmp__(self, other):
        return (cmp(self.__class__.__name__, other.__class__.__name) or 
                cmp(self.__something, other.__something))

特别糟糕的是,我可能会在维护字典(dict)的传递性方面遇到非常大的困难,这是我希望实现的一个特殊情况。

我真的需要检查我的参数类型吗?Python真的允许我查看这些吗?

2 个回答

0

你到底想做什么呢?为什么你想要按照类或类型来排序或比较不同类的实例?

如果你没有把问题说清楚,提出解决方案就很困难。

你需要为自定义类定义自己的比较方法,确保你进行的比较是有意义的,这主要还是要靠你自己。

请解释一下你想要达到的目标。这可能不是最符合Python风格的方法。

1

不幸的是,Python 2 支持这种“奇怪”的比较(幸运的是在 Python 3 中取消了)。要模拟内置的行为并不简单,因为它有很多特殊情况。例如,浮点数和整数可以直接比较(没有像你代码中那样的类型比较覆盖),但复数在比较时(除了 == 和 !=)总是会引发异常。你真的需要模拟所有这些奇怪的行为吗?这种需求非常不寻常。如果你的类型是“数字型”(比如看看 decimal.Decimal),它需要和其他数字类型友好相处,我想是这样,但那些不是“可比较数字”的类型在现实世界中有的限制就少得多……!

撰写回答