在Python中比较不同类型
首先是代码:
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),它需要和其他数字类型友好相处,我想是这样,但那些不是“可比较数字”的类型在现实世界中有的限制就少得多……!