주어진 클래스의 계층 구조로 모든 기본 클래스를 나열합니까?


답변:


196

inspect.getmro(cls)새 클래스 클래스와 이전 스타일 클래스 모두에 대해 작동하며 NewClass.mro()메소드 분석에 사용 된 순서로 클래스 및 모든 상위 클래스 목록과 동일하게 리턴합니다 .

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

2
pyobjc 클래스에서는 작동하지 않습니다. getmro searchbases (cls, result) 파일의 버전 /2.7/lib/python2.7/inspect.py ", 348 행 파일"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect cls .__ bases_에있는 _searchbases의 .py ", 339 행 : AttributeError : ' NSTaggedDate'오브젝트에 '__bases ' 속성이 없습니다.
rbp

17
당신이하려고했던 : 난 당신이 내가 발생하는 동일한 문제가 있다고 의심 @rbp inspect.getmro(obj)대신 inspect.getmro(type(obj)).
제출

44

기본 클래스의 튜플을 포함하는 python 에서 사용할 수 있는 __bases__속성을 참조하십시오 class.

>>> def classlookup(cls):
...     c = list(cls.__bases__)
...     for base in c:
...         c.extend(classlookup(base))
...     return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]

5
중복 될 수 있습니다. 이것이 바로이 문서 getmro가 "이 튜플에 클래스가 두 번 이상 나타나지 않는다" 는 문서입니다 .
Sridhar Ratnakumar

10
주의, 한 단계__bases__ 만 올라갑니다 . (귀하의 재귀 유틸리티가 암시 하듯이, 예제를 간략히 살펴보면 그 사실을 알 수 없을 것입니다.)
Bob Stein

32

inspect.getclasstree()중첩 된 클래스 목록과 해당 기본을 만듭니다. 용법:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

1
오, 좋아 더 나은 출력을 위해 pprint를 사용하십시오! python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
penguin359

20

__bases__클래스 객체 의 튜플을 사용할 수 있습니다 .

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

에 의해 반환 된 튜플 __bases__에는 모든 기본 클래스가 있습니다.

그것이 도움이되기를 바랍니다!


만약 당신의 클래스가 클래스에서 상속받은 클래스로부터 상속 받았다면, 체인의 첫 부분 만 그 안에있을 것입니다__bases__
Boris

단일 기능을 위해 전체 모듈을 가져 오지 않고도 간단하고 깨끗합니다.
Temperosa

8

python 3.7에서는 inspect를 가져올 필요가 없습니다. type.mro가 결과를 제공합니다.

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

python 3.x에서는 모든 클래스가 기본 객체 클래스에서 상속됩니다.


8

Python doc 에 따르면 class.__mro__속성 또는 class.mro()메소드를 간단히 사용할 수도 있습니다 .

>>> class A:
...     pass
... 
>>> class B(A):
...     pass
... 
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True

2

Jochen의 답변은 매우 유용하고 정확하지만 inspect 모듈의 .getmro () 메소드를 사용하여 클래스 계층을 얻을 수 있으므로 Python의 상속 계층이 다음과 같이 강조 표시되어야합니다.

전의:

class MyClass(YourClass):

상속 클래스

  • 어린이 수업
  • 파생 클래스
  • 아강

전의:

class YourClass(Object):

상속 된 클래스

  • 학부모 수업
  • 기본 수업
  • 슈퍼 클래스

한 클래스는 다른 클래스에서 상속 할 수 있습니다. 클래스의 속성이 상속됩니다. 특히 해당 메서드가 상속됩니다. 이는 상속 (자식) 클래스의 인스턴스가 상속 된 (부모) 클래스의 속성에 액세스 할 수 있음을 의미합니다.

인스턴스-> 클래스-> 상속 된 클래스

사용

import inspect
inspect.getmro(MyClass)

파이썬 내에서 계층 구조를 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.