在 Python 中,比较运算符 -- <
, <=
, ==
, !=
, >
, >=
-- 可以实现为表示与实现类相关的任何内容。在 Python 2 中是通过覆盖完成的__cmp__
,而在 Python 3 中是通过覆盖__lt__
和朋友完成的。具有issubclass()
内置方法而不是允许诸如bool < int
(true)、int < object
(true) int <= int
、 或int < float
(false) 之类的表达式的优点是什么。特别是,我会注意到排序的类issubclass()
构成了数学意义上的偏序集。
我所想的 Python 3 等价物如下所示。这段代码不会替换issubclass()
(尽管循环 MRO 会实现这一点,对吧?)。但是,这不是更直观吗?
@functools.total_ordering
class Type(type):
"Metaclass whose instances (which are classes) can use <= instead issubclass()"
def __lt__(self, other):
try:
return issubclass(self, other) and self != other
except TypeError: # other isn't a type or tuple of types
return NotImplemented
def __eq__(self, other):
if isinstance(other, tuple): # For compatibility with __lt__
for other_type in other:
if type(self) is type(other_type):
return False
return True
else:
return type(self) is type(other)
实际问题:拥有 issubclass() 内置方法而不是允许诸如 bool < int (true)、int < object (true)、int <= int 或 int < float (false) 之类的表达式有什么好处? .