Une sous-classe de la classe elle-même. Pourquoi subclassing mutuelle est interdite?

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

  •  19-09-2019
  •  | 
  •  

Question

question complexe, je suppose, mais l'étude OWL ouvert une nouvelle perspective de vivre, l'univers et tout. Je vais ici philosophique.

Je suis en train de réaliser une classe C qui est sous-classe de B qui est à son tour sous-classe de C. Juste pour le plaisir, vous savez ...

Alors voilà

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

clairement, python est intelligent et interdit cela. Cependant, dans OWL il est possible de définir deux classes à sous-classes mutuelles. La question est: quel est l'esprit ahurissant explication pourquoi cela est permis dans OWL (ce qui est un langage de programmation) et dans les langues refusé programmation

Était-ce utile?

La solution

Python ne permet pas parce qu'il n'y a aucun moyen raisonnable de le faire. Vous pouvez inventer des règles arbitraires sur la façon de traiter ce cas (et peut-être certaines langues font), mais comme il n'y a pas de gain réel en faisant, Python refuse de deviner. Les cours sont tenus d'avoir une résolution méthode stable et prévisible pour que plusieurs raisons, et si étranges, imprévisibles ou surprenants MRO ne sont pas autorisés.

Cela dit, un cas particulier en Python: type et object. object est une instance de type et type est une sous-classe de object. Et bien sûr, type est aussi une instance de type (car il est une sous-classe de object). Cela pourrait être la raison pour laquelle OWL permet:. Vous devez commencer une hiérarchie si vous voulez la classe / metaclass dans une certaine singularité, tout comme un objet et tous les objets ont une classe

Autres conseils

Le système de MRO mis en œuvre en Python (en 2.3) interdit subclassing cyclique. sont garantis de MRO valide pour satisfaire « priorité locale » et « monotonicité ». subclassing cyclique romprait monotonicité.

Cette question est abordée dans la section intitulée « mauvaise méthode de résolution Commandes »

Une partie de cette « déconnexion » est parce que OWL décrit une ontologie mondiale ouverte. Un Ontologie a peu ou rien à voir avec un programme, autre qu'un programme peut manipuler une ontologie.

Essayer de relier les concepts OWL aux langages de programmation est comme essayer de relier Pianiste et une sonate pour piano.

La sonate n'a pas vraiment une manifestion de béton jusqu'à ce que quelqu'un joue, il - idéalement un Pianiste, mais pas nécessairement. Jusqu'à ce qu'il est joué, il est juste potentiels relations entre les notes que les sons manifestèrent. Quand il est en cours de lecture, certaines des relations réelles seront pertinentes pour vous, l'auditeur. Certains ne seront pas pertinentes à l'auditeur.

Je pense que la réponse est « Quand vous construisez la classe C ... il doit créer une instance de la classe B .. qui doit créer une instance de la classe C ... et ainsi de suite » Cela ne prendra jamais fin. Ceci est interdit dans la plupart des langues (en fait, je ne sais pas d'autres cas). Vous ne pouvez créer un objet avec une « référence » à un autre objet qui peut être initialement nulle.

Pour un raisonneur sémantique, si A est une sous-classe de B et B est une sous-classe A, les classes peuvent être considérés comme équivalents. Ils ne sont pas le « même », mais dans une perspective de raisonnement, si je peux raisonner un individu est (ou non) un membre de la classe A, je peux raison, la personne est (ou non) un membre de la classe B . Les classes A et B sont sémantiquement équivalentes, ce qui est ce que vous étiez en mesure d'exprimer avec OWL.

Je suis sûr que quelqu'un peut avec un exemple où cela a du sens. Cependant, je pense que cette restriction est plus facile et non moins puissant.

Par exemple, supposons que la classe A détient des champs a et b. Classe C détient b et c. Ensuite, le point de vue sur les choses de C serait: A.Ş., C.B, C.C et la vue de A serait: A.Ş., A.b, C.C.

Il suffit de déplacer b dans une classe de base commune est beaucoup plus facile à comprendre et à mettre en œuvre, bien que.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top