답변:
즉각적인 것보다는 모든 조상 을 원한다면 inspect.getmro를 사용 하십시오 .
import inspect
print inspect.getmro(cls)
유용하게도 이것은 모든 메소드 클래스를 "메소드 해결 순서"(메서드 해결 순서)로 제공합니다. 즉, 메소드를 해석 할 때 조상이 확인되는 순서 (또는 실제로는 다른 속성-메소드 및 기타 속성이 동일한 네임 스페이스에 존재 함) 결국 파이썬에서 ;-).
cls.__mro__
(적어도 Python 3.5에서)
새로운 스타일의 클래스에는 메소드 분석 순서로 상위 클래스 목록을 리턴하는 mro 메소드가 있습니다.
object
것은 응답하지 않는 것 같습니다 mro
.
x
, 우리는 전화와 방법을 해결하기 위해 얻을 수 type(x).mro()
있다면 우리가 고려할 수 x
있다 ClassX
:와 기본 클래스로 ClassX in type(x).mro()
가장 빠른 방법은 모든 부모를 참조하고, 질서는 바로 내장 사용__mro__
즉 repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
출력, IN ORDER
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
거기 있어요 바로 지금 "최고"대답은 182 표를 가지고 (내가 이것을 입력하고로)하지만이를 찾고 루프 뒤얽힌 어떤 것보다 훨씬 간단 베이스 클래스가 두 개 이상의 부모를 확장 할 때 말할 것도없고, 한 번에 하나 개의 클래스를 클래스. inspect
클라우드 만 가져 와서 사용하여 불필요하게 범위를 지정하십시오. 솔직히 사람들이 내장 기능을 사용하는 것을 모르는 것은 부끄러운 일입니다.
이게 도움이 되길 바란다!
inspect.getmro
호출하기 만하면 됩니다. 사용 하면 더 깨끗하고 읽기 쉬운 코드가 생성됩니다. 함수 호출을 건너 뛰는 것이 실제로 더 빠릅니다. __mro__
getmro
부모를 얻으려면 기본을 사용하십시오 __mro__
(@ naught101에서 지적한대로) 메소드 해결 순서를 얻기 위해 사용하십시오 (따라서 init가 어떤 순서로 실행되었는지 알 수 있습니다).
기본 (및 기존 객체의 클래스를 먼저 가져옴) :
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
최신 Python 버전에서 mro의 경우 :
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
분명히 클래스 정의가 이미 있으면 __mro__
직접 호출 할 수 있습니다.
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
type(C()).__bases__
아래에서 추가로 언급 한 것처럼