IT story

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

hot-time 2020. 7. 14. 07:59
반응형

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


클래스가 주어지면 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__에는 모든 기본 클래스가 있습니다.

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


Although Jochen's answer is very helpful and correct, as you can obtain the class hierarchy using the .getmro() method of the inspect module, it's also important to highlight that Python's inheritance hierarchy is as follows:

ex:

class MyClass(YourClass):

An inheriting class

  • Child class
  • Derived class
  • Subclass

ex:

class YourClass(Object):

An inherited class

  • Parent class
  • Base class
  • Superclass

One class can inherit from another - The class' attributed are inherited - in particular, its methods are inherited - this means that instances of an inheriting (child) class can access attributed of the inherited (parent) class

instance -> class -> then inherited classes

using

import inspect
inspect.getmro(MyClass)

will show you the hierarchy, within Python.


In python 3.7 you don't need to import inspect, type.mro will give you the result.

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

attention that in python 3.x every class inherits from base object class.


According to the Python doc, we can also simply use class.__mro__ attribute or class.mro() method:

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

참고URL : https://stackoverflow.com/questions/1401661/list-all-base-classes-in-a-hierarchy-of-given-class

반응형