클래스가 주어지면 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)
파이썬 내에서 계층 구조를 보여줍니다.