自己的类子类.为什么禁止相互子类化?

Ste*_*ini 4 python class owl

我认为复杂的问题,但研究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
>>> 
Run Code Online (Sandbox Code Playgroud)

显然,python是聪明的,禁止这个.但是,在OWL中,可以将两个类定义为相互子类.问题是:为什么在OWL(不是编程语言)中允许这种情况并且在编程语言中不允许这是什么令人难以置信的解释?

Tho*_*ers 9

Python不允许它,因为没有合理的方法来做到这一点.你可以发明关于如何处理这种情况的任意规则(也许某些语言会这样做),但由于这样做没有实际的好处,Python拒绝猜测.由于多种原因,类需要具有稳定,可预测的方法解析顺序,因此不允许使用奇怪的,不可预测的或令人惊讶的MRO.

这就是说,有 Python中的特殊情况:typeobject.object是,的实例type,type是的子类object.当然,type同样的一个实例type(因为它的子类object).这可能是OWL允许它的原因:如果你想要一切都是一个对象而所有对象都有一个类,你需要在一些奇点中启动一个类/元类层次结构.

  • 我不打算表明这一点.MI的一致规则集确实存在.Python遵循MI的C3算法.MI层次结构基本上是扁平化的,以创建一个合理的(可预测的)MRO.但是,C3禁止模糊情况,例如继承循环和基类之间不一致的基类排序. (3认同)