프로그래밍 언어/Python

파이썬의 super ()와 다중 상속

Rateye 2021. 11. 16. 10:27
728x90
반응형
질문 : 파이썬의 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
728x90
반응형