Подкласс класса. Почему взаимное подклассов запрещено?

Сложный вопрос я предполагаю, но изучение 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 >>> 

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

6 Solutions collect form web for “Подкласс класса. Почему взаимное подклассов запрещено?”

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

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

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

Этот вопрос обсуждается в разделе, озаглавленном «Заказы на устранение неполадок»,

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

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

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

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

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

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

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

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

Interesting Posts

Python PEP8: соглашение о пустых линиях

Как рассортировать дистрибутив scipy.stats (не может сортировать объекты instancemethod)

Как защитить код Python?

Запись фрейма данных pandas в таблицу документов Word через pywin32

Удаление объекта из сеанса SQLAlchemy до его сохранения

Установка 2D-гауссовой функции с помощью scipy.optimize.curve_fit – ValueError и minpack.error

Django Query выполняет различные значения, но я не могу использовать результат запроса

Программирование сокетов python OSError: была предпринята попытка операции над чем-то, что не является сокетом

Замена изображения Django не удаляет оригинальные

почему __builtins__ является одновременно модулем и dict

Исходный код для преобразования JPG (битмап) в SVG (вектор)?

Как добавить строку заголовка в pandas DataFrame

Клавиши списка S3 boto иногда возвращают ключ каталога

Распознавание формы с помощью numpy / scipy (возможно, водораздела)

Интерфейсные модули тестирования в Python

Python - лучший язык программирования в мире.