질문 : 파이썬의 super ()는 다중 상속과 어떻게 작동합니까?
저는 파이썬 객체 지향 프로그래밍에서 꽤 새로운 편이며 super()
함수 (새 스타일 클래스)를 이해하는 데 어려움이 있습니다.
예를 들어 다음과 같은 경우 :
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
내가 얻지 못하는 것은 : Third()
클래스가 두 생성자 메서드를 상속 할 것인가? 그렇다면 어떤 것이 super()
와 함께 실행되며 그 이유는 무엇입니까?
그리고 다른 하나를 실행하려면 어떻게해야합니까? Python 메서드 확인 순서 (MRO )와 관련이 있다는 것을 알고 있습니다.
답변
이것은 Guido 자신의 블로그 게시물 Method Resolution Order (이전 두 번의 시도 포함)에서 합리적인 양의 세부 사항으로 자세히 설명되어 있습니다.
귀하의 예에서 Third()
는 First.__init__
호출합니다. 파이썬은 왼쪽에서 오른쪽으로 나열된 클래스의 부모에서 각 속성을 찾습니다. 이 경우 __init__
찾고 있습니다. 따라서 정의하면
class Third(First, Second):
...
파이썬은보고 시작합니다 First
경우와 First
속성이없는, 그것은 볼 것이다 Second
.
이 상황은 상속이 경로를 건너기 시작할 때 더 복잡해집니다 (예 : First
Second
에서 상속 된 경우). 자세한 내용은 위의 링크를 읽으십시오. 그러나 간단히 말해서 Python은 자식 클래스 자체부터 시작하여 상속 목록에 각 클래스가 나타나는 순서를 유지하려고합니다.
예를 들어 다음과 같은 경우 :
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
MRO는 [Fourth, Second, Third, First].
그건 그렇고, 파이썬이 일관된 메서드 해결 순서를 찾을 수 없으면 사용자를 놀라게 할 수있는 동작으로 돌아가는 대신 예외를 발생시킵니다.
모호한 MRO의 예를 추가하도록 편집되었습니다.
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
Third
의 MRO는 [First, Second]
또는 [Second, First]
여야합니까? 명백한 기대는 없으며 Python은 오류를 발생시킵니다.
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases Second, First
편집 : super()
호출이 부족하다고 주장하는 사람들이 여러 명 있습니다. 설명하겠습니다. 예제의 요점은 MRO가 어떻게 구성되는지 보여주는 것입니다. "첫 번째 \ n 두 번째 \ 세 번째"등을 인쇄하기위한 것이 아닙니다. 물론 예제를 가지고 놀고, super()
호출을 추가하고, 무슨 일이 일어나는지 확인하고, 파이썬의 상속 모델에 대해 더 깊이 이해할 수 있습니다. 하지만 여기서 제 목표는 간단하게 유지하고 MRO가 어떻게 구축되는지 보여주는 것입니다. 그리고 내가 설명했듯이 구축되었습니다.
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
출처 : https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python을 사용하여 문자열에서 문자를 삭제하는 방법 (0) | 2021.11.16 |
---|---|
파이썬에서 "assert" 사용법 (0) | 2021.11.16 |
Python에서 XML 출력하기 (0) | 2021.11.16 |
파이썬에서 list를 반대로 출력하는 방법 (0) | 2021.11.15 |
pip의 캐시를 제거 하는 방법 (0) | 2021.11.12 |