2

在 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) 之类的表达式有什么好处? .

4

3 回答 3

2

粗体字的优点之一:

issubclass(class, classinfo)

如果 class 是 classinfo 的子类(直接、间接或虚拟),则返回 true。一个类被认为是它自己的一个子类。classinfo 可能是类对象的元组,在这种情况下,将检查 classinfo 中的每个条目。在任何其他情况下,都会引发 TypeError 异常。

另一个是它是描述性的。不是每个使用 Python 的人都是数学家。

于 2012-04-10T20:07:40.533 回答
2

因为它会违背 Python 的禅宗:http: //www.python.org/dev/peps/pep-0020/

Explicit is better than implicit.

如果您单独查看以下代码行:

issubclass(a, b)

很明显aandb是包含类的变量,我们正在检查是否ab. 如果它们碰巧不包含类,你就会知道。

但是看着这个

a < b

不会告诉你任何事情。您需要检查周围的代码以确定它们包含类,然后才能知道我们正在检查的类a是否是b. 如果说 a=5 和 b=6 它仍然会“正常”运行。

但是 Python 是灵活的,所以如果你真的想要这个,你可以实现一个具有你所展示的行为的基本类型。

实际上 - 顺便说一句 - 例如,C++ 中重载运算符的普遍存在是该语言的一个重大缺点(至少在我看来),因为当你看到a + b它时,它可能会发射你所知道的核导弹......直到您检查 a/b 的类型,查找类实现和+运算符重载实现(如果有的话......如果没有,看看父类是否有......如果没有,看看父类是否......)

于 2012-04-10T21:07:50.437 回答
0

我会说优势是非功能性的。唯一的技术区别是中<缀。

但这个问题与技术无关。它似乎与语义和易于阅读有关。

使用<将表示顺序。尽管类层次结构可以解释为“可排序的”,但它始终是一个近似值。对很多人来说,一个不明显的。

使用issubclass更清晰、更简单,除了它的实际作用之外,没有其他解释:检查object/classinfo是否是class.

朴素、简单、明确、有效。这些就是优点。也许你不/不能利用它们。但这已经是个人品味了。

于 2012-04-10T21:12:26.233 回答