2010-02-08 5 views
4

복잡한 질문 나는 생각한다. 그러나 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 (프로그래밍 언어가 아닌)에서 허용되는 이유와 프로그래밍 언어에서 허용되지 않는 이유에 대해 생각할 수없는 설명은 무엇입니까?

답변

9

파이썬은 합리적인 방법이 없기 때문에 허용하지 않습니다. 그러한 케이스 (그리고 아마 몇몇 언어들)를 다루는 방법에 대한 임의의 규칙을 만들 수 있지만, 그렇게하는 것에 실제 이득이 없으므로, 파이썬은 추측을 거부합니다. 수업은 여러 가지 이유로 안정적이고 예측 가능한 방법 결정 순서가 있어야하며 이상하거나 예측할 수 없거나 놀라운 MRO는 허용되지 않습니다.

즉, 이며 파이썬에서는 특별한 경우 인 typeobject입니다. objecttype의 인스턴스이고 typeobject의 하위 클래스입니다. 물론 type이고 인 인스턴스는 type입니다 (서브 클래스는 object이므로). 이것은 OWL이 허용하는 이유 일 수 있습니다. 모든 것이 객체이고 모든 객체가 클래스를 갖기를 원한다면 클래스/메타 클래스 계층 구조를 일부 특이점에서 시작해야합니다.

+0

상호 상속을위한 일관된 룰 세트가 존재하지 않음을 나타냅니다. 왜 그런지 자세히 설명해 주시겠습니까? – bayer

+3

나는 그것을 나타내려고하지 않습니다. MI에 대한 일관된 규칙 집합이 존재합니다. 파이썬은 MI에 대한 C3 알고리즘을 따른다. MI 계층 구조는 기본적으로 합리적인 (예측 가능한) MRO를 만들기 위해 평평하게되어 있습니다. 그러나 C3는 상속주기와 기본 안경 사이의 일관되지 않은 기본 클래스 순서와 같이 모호한 상황을 금지합니다. –

+0

C3 알고리즘 ... 흠 ... 너무 무식하고 너무 자주 느껴진다. (googling ... –

1

대답은 "클래스 C를 만들면 ... 클래스 C의 인스턴스를 만들어야하는 클래스 B의 인스턴스를 만들어야합니다 ... 등등"이 작업은 끝나지 않을 것입니다. 이것은 대부분의 언어에서 금지되어 있습니다 (사실 저는 다른 사례를 모릅니다). 처음에는 null 일 수있는 다른 개체에 대한 '참조'로만 개체를 ​​만들 수 있습니다.

+1

아니요, 서브 클래 싱은 파이썬에서 그렇게 작동하지 않습니다. 서브 클래스의 인스턴스는 수퍼 클래스의 인스턴스를 작성하거나 포함하지 않습니다. –

+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 체계 (2.3 버전)는 순환 서브 클래 싱을 금지합니다. 유효한 MRO는 "로컬 우선 순위"및 "단조 로움"을 만족하도록 보장됩니다. 순환 서브 클래 싱은 단조 로움을 깨뜨릴 것입니다. OWL 열린 세계 온톨로지를 설명하기 때문에

이 문제는이 "분리"의 "Bad Method Resolution Orders"

2

부 제목의 섹션에서 설명이다. 온톨로지는 프로그램과 관련이 거의 없거나 전혀 없습니다. 프로그램이 온톨로지를 조작 할 수있는 것 외에는 없습니다.

OWL 개념을 프로그래밍 언어와 관련시키려는 시도는 피아니스트와 피아노 소나타를 연관시키는 것과 같습니다.

소나타는 누군가가 그것을 연주 할 때까지는 이상한 피아니스트가 아닙니다. 이상적으로는 피아니스트이지만 반드시 그런 것은 아닙니다. 연주 될 때까지 잠재 성이 있음 음표 사이의 관계는 소리로 나타납니다. 재생중인 경우 실제 관계의 일부는 청취자와 관련이 있습니다. 일부는 청취자와 관련이 없습니다.

+0

지금 당장하고있는 일은 내가 온톨로지에 따라 엔티티를 기술한다는 것인데,이 엔티티가 클래스에 매핑된다는 것은 물론 온톨로지에 상호 하위 클래스가 포함되어 있다면 해당 올빼미 클래스를 프로그램 클래스에 매핑 할 수 없습니다. 잘못된 접근 방식이지만, 현재 내가 가지고있는 자원, 내가 가지고있는 시간, 내가 가진 시간으로 할 수있는 최선의 방법입니다. 다행히도 그런 경우는 없으며 내 온톨로지는 간단하므로 생성 할 수 있습니다. –

+1

대부분 우리는 우리의 엔티티와 온톨로지를 코드 외부에 정의합니다. 우리는 엔티티를 분류하기 위해 온톨로지 규칙을 사용하여 엔티티에 대해 추론하는 코드를 작성합니다. OO 프로그래밍 언어. 이것은 온톨로지에서 코드를 생성하려는 문제를 지적합니다. 온톨로지에서 코드를 생성하는 것은 온톨로지를 사용하여 코드를 작성할 때 추론을 안내하여 ** 수행 할 수 있습니다 **. –

+0

감사합니다 @ S.Lott, 귀하의 의견은 매우 흥미 롭습니다. –

1

의미 론적 추론을 위해 A가 B의 하위 클래스이고 B가 A의 하위 클래스 인 경우 클래스는 동등한 것으로 간주 될 수 있습니다. 그들은 "같은"것이 아니라 추론의 관점에서, 개인이 클래스 A의 멤버 (또는 그렇지 않은 사람)라고 추론 할 수 있다면, 나는 그 개인이 클래스 B의 멤버 (또는 그렇지 않은 사람)라고 추론 할 수 있습니다. 클래스 A와 클래스 B는 의미 상 동일합니다. 이는 OWL로 표현할 수 있었던 것입니다.