파이썬 클래스의 부모를 얻는 방법?


202

파이썬 클래스의 부모 클래스를 어떻게 구할 수 있습니까?

답변:


233

다음 속성을 사용하십시오.

cls.__bases__

로부터 문서 :

클래스 객체의 기본 클래스 튜플.

예:

>>> str.__bases__
(<type 'basestring'>,)

다른 예시:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)

1
인스턴스화 된 객체의 기반을 얻으려면 type(C()).__bases__아래에서 추가로 언급 한 것처럼
— citynorman

106

즉각적인 것보다는 모든 조상 을 원한다면 inspect.getmro를 사용 하십시오 .

import inspect
print inspect.getmro(cls)

유용하게도 이것은 모든 메소드 클래스를 "메소드 해결 순서"(메서드 해결 순서)로 제공합니다. 즉, 메소드를 해석 할 때 조상이 확인되는 순서 (또는 실제로는 다른 속성-메소드 및 기타 속성이 동일한 네임 스페이스에 존재 함) 결국 파이썬에서 ;-).


34
당신은 또한 사용할 수 있습니다 cls.__mro__(적어도 Python 3.5에서)
— naught101

@ naught101, plz는 전체 답변으로 바꿉니다. 나는 거의 그것을 놓 쳤고, 그렇게 할 것이다. 나는 많은 다른 사람들을 생각한다.
— 시합 Shahriar 칸

14

새로운 스타일의 클래스에는 메소드 분석 순서로 상위 클래스 목록을 리턴하는 mro 메소드가 있습니다.


새로운 스타일의 수업은 무엇입니까? Django 모델에서 이것을 사용할 수있는 것 같지만 단순히 상속받은 object것은 응답하지 않는 것 같습니다 mro.
— Brian Kung

1
객체를 고려하면 x, 우리는 전화와 방법을 해결하기 위해 얻을 수 type(x).mro() 있다면 우리가 고려할 수 x있다 ClassX:와 기본 클래스로 ClassX in type(x).mro()
— 648trindade

13

가장 빠른 방법은 모든 부모를 참조하고, 질서는 바로 내장 사용__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클라우드 만 가져 와서 사용하여 불필요하게 범위를 지정하십시오. 솔직히 사람들이 내장 기능을 사용하는 것을 모르는 것은 부끄러운 일입니다.

이게 도움이 되길 바란다!


@ John Smith stackoverflow.com/users/139885/john-smith , 나는 당신 이이 답변을 참조 바랍니다. 당신이 그것을 좋아한다면, upvote와 함께 알려주십시오!
— PyTis

1
실제로 github.com/python/cpython/blob/… 에서 볼 수 있듯이 객체를 inspect.getmro호출하기 만하면 됩니다. 사용 하면 더 깨끗하고 읽기 쉬운 코드가 생성됩니다. 함수 호출을 건너 뛰는 것이 실제로 더 빠릅니다. __mro__getmro
— tna0y

9

부모를 얻으려면 기본을 사용하십시오 __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)

3

모두 호출되도록하려면 super모든 수준에서 사용하십시오 .


super를 사용하면 어쨌든 모든 수준에서 사용해야하므로 명시 적으로 사용하도록 문서화해야합니다. 또한 모든 수업에서 수퍼가 작동하지 않는다는 것을 알고 싶을 수도 있습니다.
— DasIch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.