Eine Klasse Unterklasse von selbst. Warum gegenseitige Subklassifizieren ist verboten?

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

  •  19-09-2019
  •  | 
  •  

Frage

Komplexe Frage Ich gehe davon aus, aber das Studium OWL eröffnet eine neue Perspektive zu leben, das Universum und alles. Ich werde hier philosophisch.

Ich versuche, eine Klasse C zu erreichen, die Unterklasse von B ist wiederum die Unterklasse von C. Just for fun ist, wissen Sie ...

Also hier ist es

>>> 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
>>> 

klar, Python ist klug und verbietet dies. Doch in OWL ist es möglich, zwei Klassen zu definieren gegenseitige Subklassen sein. Die Frage ist: Was ist die umwerfend Erklärung, warum dies in OWL erlaubt ist, in Programmiersprachen und nicht anerkannt (die keine Programmiersprache ist)

War es hilfreich?

Lösung

Python erlaubt es nicht, weil es keine vernünftige Art und Weise ist, es zu tun. Sie könnten willkürliche Regeln erfinden, wie ein solcher Fall zu behandeln (und vielleicht einige Sprachen zu tun), aber da gibt es dabei keine tatsächliche Verstärkung ist, weigert sich Python zu erraten. Die Klassen sind erforderlich, um eine stabile, berechenbare Verfahren Auflösung, um für eine Reihe von Gründen zu haben, und so seltsam, unberechenbar oder überraschend MROs sind nicht erlaubt.

Das heißt, es ist ein Sonderfall in Python: type und object. object ist eine Instanz type und type ist eine Unterklasse von object. Und natürlich type ist auch eine Instanz von type (da es eine Unterklasse von object). Dies könnte sein, warum OWL erlaubt es. Sie brauchen eine Klasse / metaclass Hierarchie in einem gewissen Singularität zu starten, wenn Sie alles wollen ein Objekt und alle Objekte sein, um eine Klasse zu haben

Andere Tipps

Das MRO-Schema in Python implementiert (ab 2.3) verbietet zyklische Subklassifizieren. Gültige MRO ist garantiert „lokalen Vorrang“ und „Monotonie“ gerecht zu werden. Zyklische Subklassifizieren würde brechen die Monotonie.

Dieses Problem wird in dem Abschnitt mit dem Titel "Bad Methode Auflösung Orders"

Ein Teil dieser „disconnect“ ist, weil OWL eine offene Welt Ontologie beschreibt. Ein Ontology hat wenig oder nichts mit einem Programm, anders als ein Programm zu tun kann eine Ontologie manipulieren.

Der Versuch, OWL Konzepte Programmiersprachen zu beziehen ist wie der Versuch, Pianist und Klaviersonate zu beziehen.

Die Sonate hat nicht wirklich eine konkrete manifestion bis jemand es zu spielen - im Idealfall ein Pianist, aber nicht unbedingt. Bis es gespielt wird, es ist nur Potential Beziehungen zwischen Noten als Klänge manifestiert. Wenn es gespielt wird, werden einige der tatsächlichen Beziehungen für Sie relevant sein, der Hörer. Einige werden nicht auf den Hörer relevant sein.

Ich denke, die Antwort ist „Wenn Sie Klasse C konstruieren ... es Instanz der Klasse B erstellen müssen .. welche Instanz der Klasse C schaffen müssen ... und so weiter“ Das wird nie enden. Dies ist in den meisten Sprachen verboten (in der Tat ich weiß nicht, anderen Fall). Sie können nur ein Objekt mit einem ‚Referenz‘ auf ein anderes Objekt erstellen, die anfänglich null sein kann.

Für einen semantischen reasoner, wenn A eine Unterklasse von B ist, und B ist eine Unterklasse von A, dann können die Klassen als gleichwertig betrachtet werden. Sie sind nicht die „gleich“, sondern aus einer Argumentation Perspektive, wenn ich ein individuelle Vernunft kann (oder nicht) ein Mitglied der Klasse A, kann ich Grund, das Individuum ist (oder nicht) ein Mitglied der Klasse B . Die Klassen A und B sind semantisch äquivalent, das ist, was Sie mit OWL auszudrücken konnten.

Ich bin sicher, dass jemand kann mit einem Beispiel, wo dies sinnvoll ist. Aber ich denke, diese Einschränkung ist einfacher und nicht weniger mächtig.

Zum Beispiel, sagen wir mal Klasse A hält Felder a und b. Klasse C hält, b und c. Dann wird die Sicht auf die Dinge von C wäre: Å, C.b, C.C und die Aussicht von A wäre: Å, A.b, G.U.

Just bewegen b in eine gemeinsame Basisklasse ist viel einfacher zu verstehen und umzusetzen, though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top