自身のクラスのサブクラス。なぜ、相互のサブクラスを禁止されていますか?

StackOverflow https://stackoverflow.com/questions/2223300

  •  19-09-2019
  •  | 
  •  

質問

複雑な私は仮定の質問が、OWLの勉強は、宇宙、すべてを生きるための新しい視点を開きました。私はここに哲学的つもりです。

私は

...今度はあなたが知っている、ちょうど楽しみのためにCのサブクラスである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には、相互のサブクラスであることを2つのクラスを定義することが可能です。質問です:?これは(プログラミング言語ではありません)OWLで許さやプログラミング言語で禁止されている理由の心遠くなるような説明が何である

役に立ちましたか?

解決

それを行うには賢明な方法はありませんので、

Pythonがそれを許可していません。あなたは、このようなケースを処理する方法についての任意のルールを発明することができ(そしておそらくいくつかの言語が行う)、そうすることで実際のゲインがないので、Pythonは推測することを拒否します。クラスはいくつかの理由で安定した、予測可能な方法で解決順序が要求され、したがって、奇妙な予測できないまたは意外MROプロバイダーが許可されていない。

があり、言ったPythonでの特殊ケースである:typeobjectobjecttypeのインスタンスであり、そしてtypeobjectのサブクラスです。そしてもちろん、typetypeのものインスタンス(それはobjectのサブクラスだから)です。 OWLは、それを可能にする理由はここにあるかもしれない:あなたはすべてがクラスを持っているオブジェクトとすべてのオブジェクトになりたい場合は、いくつかの特異点ではクラス/メタクラス階層を起動する必要があります。

他のヒント

(2.3のような)Pythonで実装MROスキームは、環状サブクラスを禁止します。有効なMROのは、「ローカル優先」と「単調」を満たすことが保証されています。巡回サブクラス化は、単調性を破ります。

この問題はセクションで説明されて「悪いメソッド解決受注」と題します

OWLは、オープンワールドのオントロジーを記述しているので、この「切断」の一部です。オントロジーはオントロジーを操作できるプログラム以外のプログラム、で行うのか、少しは何もしています。

プログラミング言語にOWLの概念を関連付けるしようとすると、ピアニストとピアノ・ソナタを関連付けるしようとしているようなものです。

ピアニスト理想的には、必ずしもそうとは限らない -

ソナタは本当に誰かがそれを再生するまでの具体的なmanifestionを持っていません。それが再生されていますまでは、それだけで、<全角>ノートの中で潜在的なの関係が音として現れるのです。それが再生されていた場合、実際の関係のいくつかは、あなた、リスナーに関連するだろう。いくつかは、リスナーに関連しません。

私は答えは「あなたはクラスCを構築すると...それは、クラスCのインスタンスを作成する必要があり、クラスB ..のインスタンスを作成する必要があります...そしてそうに」これは決して終わらないだろうと思います。これは、(実際には、私は他のケースを知らない)、ほとんどの言語で禁じられています。 あなただけの、最初はnullにすることができ、他のオブジェクトへの「参照」でオブジェクトを作成することができます。

AはBのサブクラスであり、BはAのサブクラスである場合は、

セマンティック推論については、その後クラスが同等と考えることができます。彼ら私が個人である(又はない)推論できる場合、クラスAのメンバーで「同じ」ではなく、推論の観点から、私が個人である(又はない)理由ができるクラスBのメンバ。クラスA及びBを使用して、OWLで表現することができたものであり、意味的に等価である。

私は誰かが、これは理にかなっている例でアップすることができます確信しています。しかし、私はこの制限はそれほど強力で簡単に、ではないと思います。

たとえば、のは、クラスAは、フィールドaとbを保持しているとしましょう。クラスCはBとCを保持しています。そして、Cから物事のビューは次のようになります:aの化合物。表には、C.b、C.cとAからの眺めは、次のようになりますaの化合物。表、A.b、C.c.

ただ、共通の基底クラスにBを移動するものの、理解し、実装がはるかに簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top