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


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.