클래스가 주어지면 Foo
( 새로운 스타일의 클래스인지 아닌지) 상속 계층의 어느 곳에서나 모든 기본 클래스를 어떻게 생성 issubclass
합니까?
클래스가 주어지면 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'>)
inspect.getmro(obj)
대신 inspect.getmro(type(obj))
.
기본 클래스의 튜플을 포함하는 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>]
getmro
가 "이 튜플에 클래스가 두 번 이상 나타나지 않는다" 는 문서입니다 .
__bases__
만 올라갑니다 . (귀하의 재귀 유틸리티가 암시 하듯이, 예제를 간략히 살펴보면 그 사실을 알 수 없을 것입니다.)
inspect.getclasstree()
중첩 된 클래스 목록과 해당 기본을 만듭니다. 용법:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
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)
파이썬 내에서 계층 구조를 보여줍니다.