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

클래스가 주어지면 Foo( 새로운 스타일의 클래스인지 아닌지) 상속 계층의 어느 곳에서나 모든 기본 클래스를 어떻게 생성 issubclass합니까?



답변

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'>)


답변

기본 클래스의 튜플을 포함하는 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>]


답변

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

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


답변

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

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

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

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


답변

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에서는 모든 클래스가 기본 객체 클래스에서 상속됩니다.


답변

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


답변

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

전의:

class MyClass(YourClass):

상속 클래스

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

전의:

class YourClass(Object):

상속 된 클래스

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

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

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

사용

import inspect
inspect.getmro(MyClass)

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