2010-02-08 2 views
4

Сложный вопрос Я предполагаю, но изучение OWL открыло новую перспективу жизни, вселенную и все такое. Я буду философствовать здесь.Подкласс класса. Почему взаимное подклассов запрещено?

Я пытаюсь достичь класса С, который является подклассом 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 
>>> 

ясно , питон умный и запрещает это. Однако в OWL можно определить два класса как взаимные подклассы. Вопрос в том, каково умопомрачительное объяснение, почему это допускается в OWL (который не является языком программирования) и запрещен в языках программирования?

ответ

9

Python не позволяет этого, потому что нет разумного способа сделать это. Вы можете изобрести произвольные правила о том, как обращаться с таким случаем (и, возможно, с некоторыми языками), но поскольку нет реального выигрыша в этом, Python отказывается догадываться. Классы должны иметь стабильный, предсказуемый порядок разрешения метода по ряду причин, и поэтому странные, непредсказуемые или неожиданные MRO не допускаются.

Тем не менее, есть это особый случай в Python: type и object. object является примером type, а type является подклассом object. И, конечно, typeтакже экземпляр type (так как это подкласс object). Возможно, поэтому OWL позволяет это: вам нужно запустить иерархию класса/метакласса в какой-то особенности, если вы хотите, чтобы все было объектом и всеми объектами, имеющими класс.

+0

Вы указываете, что не существует согласованного набора правил для взаимного наследования. Можете ли вы объяснить, почему это так? – bayer

+3

Я не собираюсь это указывать. Существует согласованный набор правил для МИ. Python следует алгоритму C3 для MI. Иерархия ИИ в основном сглажена для создания разумного (и прогнозируемого) MRO. Однако C3 запрещает неоднозначные ситуации, такие как циклы наследования и несогласованное упорядочение базового слоя между базовыми классами. –

+0

C3 алгоритм ... хммм ... Я чувствую себя настолько невежественным, так часто :(googling ... –

1

Я думаю, что ответ: «Когда вы строите класс C ... он должен создать экземпляр класса B .., который должен создать экземпляр класса C ... и т. Д.« Это никогда не закончится. Это запрещено на большинстве языков (на самом деле я не знаю другого случая). Вы можете создать объект с «ссылкой» на другой объект, который может быть первоначально нулевым.

+1

Нет, подкласс не работает таким образом в Python. Экземпляр подкласса не создает или не содержит экземпляр суперкласса. –

+0

Это своего рода смысл ... если я слышу то, что вы говорите, это потому, что у вас есть код для выполнения, тогда как OWL связан только с описанием логических отношений между сущностями. в последнем случае взаимное подклассификация не вводит никакой двусмысленности, она будет обрабатываться только на логическом уровне. –

0

Я уверен, что кто-то может подняться с примером, где это имеет смысл. Однако, я думаю, это ограничение проще и не менее мощно.

Например, предположим, что класс A содержит поля a и b. Класс C имеет значения b и c. Тогда вид на вещи из C будет: A.a, C.b, C.c, а вид из A будет: A.a, A.b, C.c.

Просто перемещение b в общий базовый класс гораздо легче понять и реализовать.

2

Схема MRO, реализованная в Python (начиная с версии 2.3), запрещает циклическое подклассу. Действительные MRO гарантируют удовлетворение «локального приоритета» и «монотонности». Циклическое подклассирование ломает монотонность.

Этот вопрос обсуждается в разделе, озаглавленном "Bad Method Resolution Orders"

2

Часть этого «разъединение», потому что OWL описывает открытую мировую онтологию. Онтология имеет мало или ничего общего с программой, кроме программы, которая может манипулировать онтологией.

Пытаясь связать концепции OWL с языками программирования, это похоже на попытку связать пианиста и фортепианную сонату.

Соната действительно не имеет конкретного проявления, пока кто-то не играет в нее - в идеале пианист, но не обязательно. Пока он не играет, это всего лишь потенциал отношения между нотами, проявляемыми как звуки. Когда он будет воспроизводиться, некоторые из реальных отношений будут иметь отношение к вам, слушателю. Некоторые не будут иметь отношение к слушателю.

+0

То, что я делаю прямо сейчас, это то, что я описываю объекты в соответствии с онтологией. Эти объекты сопоставляются с классами. Конечно, если онтология содержит взаимные подклассы, я не могу сопоставить эти классы совы с программными классами. Я знаю, что я использую неправильный подход, но на данный момент, с ресурсами, которые у меня есть, ограничениями, которые у меня есть, и временем, которое у меня есть, это лучшее, что я могу сделать. К счастью, таких случаев у меня нет, и моя онтология проста, поэтому я могу создать сопоставление классов вручную. –

+1

В большинстве случаев мы определяем наши сущности и онтологию * вне * нашего кода. Мы пишем наш код, чтобы рассуждать о сущностях, использующих правила онтологии, для классификации сущностей. Ваш фундаментальный вопрос связан с наблюдением, что онтология богаче, чем OO язык программирования. Это указывает на проблему попыток генерировать код из онтологии. Генерирование кода из онтологии может быть выполнено ** ** только с помощью онтологии, чтобы вести рассуждения при создании кода. –

+0

Спасибо @ S.Lott, ваш комментарий был очень интересным. –

1

Для семантического аргумента, если A является подклассом B, а B является подклассом A, то классы можно считать эквивалентными. Они не являются «теми же», но с точки зрения рассуждений, если я могу рассуждать, что человек является (или не является) членом класса A, я могу рассуждать, что человек является (или не является) членом класса B . Классы A и B семантически эквивалентны, что вы могли бы выразить с помощью OWL.