2014-11-05 1 views
0

저는 솔리드 자바 (및 Matlab) 배경에서 왔으며 최근에 파이썬 (3.4)을 가르치려고 노력하고 있습니다. Java API 문서 (http://docs.oracle.com/javase/7/docs/api/)에서 특정 클래스에 대한 설명서에는 항상 해당 클래스의 조상에 대한 개요가 표시됩니다 (예 : this screenshot 참조).유형/클래스의 파이썬 계층 구조에 대한 개요를 얻으려면 어떻게해야합니까?

이제 파이썬 클래스에 대해 유사한 조상 계층 구조를 볼 수있는 방법이 있는지 궁금합니다. 나는 파이썬이 객체 지향 언어이기 때문에, 모든 원시 타입이 아닌 객체가 될 것이라는 가정에서부터 일하고있다. 서로 다른 유형의 조상을 이해하면 반복 가능성, 순서,보기 및 목록에 대한 이해가 크게 향상됩니다.

비슷한 질문에 대한 답변 (예 : here)에서 제안한 것처럼 몇 가지 시도를했습니다. 그러나 inspect.mro(cls)이 항상 작동하는 것은 아닙니다.

In[30]: type({}.keys()) Out[30]: dict_keys

가 나는 또한 반복 가능한 상속하지 않는 목록을 배울 매우 놀랐습니다 :

inspect.getmro(dict_keys)

도 dict_keys하지만이 유형입니다 : 예를 들어, 다음과 같은 오류를 제공합니다

In[34]: inspect.getmro(list) Out[34]: (list, object)

제 질문은 주로 표준 Python 라이브러리의 계층 구조를 보는 방법 (그리고 이상적으로 찾아보기),리스트/시퀀스/뷰/iterables가 형식적으로 어떻게 관련되는지를 비롯하여 기본 형식의 계층 구조를 이해하는 방법에 대한 다른 의견도 매우 환영받을 것입니다. 파이썬 튜토리얼은 정말 훌륭한 것은 아닙니다.

+0

* 파이썬에서 모든 것은 * 객체입니다. – Ffisegydd

+0

예, @Ffisegydd, 정확히 내가 가정하고있는 가정입니다. :) 그런데'type ({}. keys()) '는'dict_keys '를 산출하지만'dict_keys'를 산출하면'dict_keys가 정의되지 않았습니다. '... – EelkeSpaak

+0

개요 https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy –

답변

2

뭔가가 유형이기 때문에 글로벌 네임 스페이스에서 해당 유형에 대한 참조가 있다는 것을 의미하지는 않습니다. dict_keys의 경우입니다. 예 :

>>> inspect.getmro(type({}.viewkeys())) # using python2.x :-(
(<type 'dict_keys'>, <type 'object'>) 

그래서 그것은 MRO를 가지고, 그것은 관리 가능하다 - 당신은 지금 전에 dict_keys 유형에 핸들이 없었다.

>>> import collections 
>>> issubclass(list, collections.Iterable) 
True 

그래서 우리는 list 적어도 그것은 당신이 MRO에서 찾을 수 없습니다 비록 collections.Iterable의 서브 클래스입니다를 생각하는 것을 다음을 참조하십시오 MRO는 조금 현혹 될 수 있다는

참고. 이는 abc 모듈을 사용하는 collections.Iterable 실제로는 register 자체이기 때문입니다.

저는 이것이 파이썬과 자바의 기본적인 차이점 중 하나라고 생각합니다. 파이썬에서는 일반적으로 실제 유형 및 상속 트리가 아닌 객체가 제공하는 인터페이스에 대해 더 신경을 쓴다. 어떤 레벨에서이 문장은 약간의 보잘것없는 것처럼 보일 수 있습니다. 결국 객체가 제공하는 인터페이스를 알기 위해서는 상속 트리를 알아야합니다. tuple, listgenerator 객체가 object 위 (그것이 가상 기본 클래스이기 때문에 계산하지 않습니다 collections.Iterable) 진짜 공통 기본 클래스를 가지고 있지에도 불구하고 이상 반복 할 수있는 이유 그러나 우리는 인터페이스에서 일하는 사실은 수 (정확히 이상 반복).

+0

아, 적어도 내 혼란의 일부에 답변 해 주셔서 감사합니다. dict_keys가 전역 네임 스페이스에 명시 적으로 가져 오지 않았다면 dict_keys가 전역 네임 스페이스에 존재하지 않는다는 것을 당연히 생각해 보면됩니다. 그러나 여전히 클래스 계층 구조를 탐색하는 편리한 방법이 있는지 여부에 대한 의문이 남아 있습니다. 하지만이 계층 구조가 자바보다 Python에서 훨씬 더 복잡하다고 의심하기 시작했습니다. "가상 서브 클래스"등으로 어떤 것입니까? :) Java에서는 모든 클래스 (Object 제외)는 정확히 하나의 부모를 가지며 추가적으로 인터페이스. 이것은 나를 오도 할 수 있습니다. – EelkeSpaak

+0

@EelkeSpaak : 실제로 Java의 기본 설계 중 하나는 단일 상속만을 지원하는 것입니다. 파이썬은 다중 상속을 허용합니다. mgilson의 대답은 평범한 영어 방식으로 "인터페이스"를 언급하고 있지만, 물론 자바는 인터페이스라는 실제 언어 구조를 가지고 있습니다.이 언어 구조는 다중 상속을 연상케하는 방식으로 클래스 관계를 복잡하게합니다. 궁극적으로, Java에 대한 지식이 Python을 배우는 데 도움이된다고 생각하는 동안, 유추를 너무 멀리하지 않도록주의해야합니다. –

+0

@ 쟈니 - 고마워. 불행히도 나는 많은 Java를 모르기 때문에 너무 멀리 할 수 ​​없습니다. 나는 단어의 의미에서 "인터페이스"를 의미합니다. 물론 거기에는 공식적인 개념이 있습니다. 내가 말하는 것은 훨씬 덜 공식적인 것입니다. – mgilson

관련 문제