本身的类子类。为什么禁止相互子类化?


问题内容

我认为这是一个复杂的问题,但是研究OWL为生活,宇宙和一切开辟了新的视角。我在这里讲哲学。

我正在尝试实现C的一个类,它是B的子类,而B的子类又是C的子类。只是为了好玩,您知道…

所以这是

>>> class A(object): pass
... 
>>> class B(A): pass
... 
>>> class C(B): pass
... 
>>> B.__bases__
(<class '__main__.A'>,)
>>> B.__bases__ = (C,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a __bases__ item causes an inheritance cycle
>>>

显然,python很聪明,禁止这样做。但是,在OWL中,可以将两个类定义为互为子类。问题是:令人费解的解释是什么,为什么在OWL(这不是编程语言)中允许这样做,而在编程语言中不允许这样做呢?


问题答案:

Python不允许这样做,因为没有明智的方法。您可以发明有关如何处理这种情况的任意规则(也许某些语言可以做到),但是由于这样做没有实际好处,因此Python拒绝猜测。由于多种原因,要求类具有稳定的,可预测的方法解析顺序,因此,不允许进行怪异,不可预测或令人惊讶的MRO。

这就是说,有
Python中的特殊情况:typeobjectobject是的实例typetype是的子类object。当然,type
也是的
一个实例type(因为它是的子类object)。这可能就是OWL允许这样做的原因:如果您希望所有事物都成为一个对象并且所有对象都具有一个类,则需要以某种特殊性启动类/元类层次结构。