인프런 커뮤니티 질문&답변
클래스 상속 순서? 질문
작성
·
343
1
class Siri가 상속을 받을 때,
class Siri(Robot[ARM, HEAD], Generic[ARM, HEAD]):
pass
는 되는데,
class Siri( Generic[ARM, HEAD], Robot[ARM, HEAD]):
pass
위는 cannot create consistent method ordering에러를 내뱉네요. 상속 순서가 의미하는 것이 뭔가요?
mro 찍어보니까 이렇게 나오네요.
print(Siri.mro())
[<class '__main__.Siri'>, <class '__main__.Robot'>, <class 'typing.Generic'>, <class 'object'>]
답변 2
2
지나가다가 우연히 아는 내용이 보이길래 댓글 달아봅니다.
파이썬에서는 mro때문에 상속 순서가 매우 중요합니다.
Generic을 먼저 상속받고 Robot을 상속받는 두 번째 코드는 내부적으로 다음과 같이 처리됩니다.
Siri -> Generic(Siri의 부모) -> Robot(Generic의 부모)
먼저 상속받는 클래스가 높은 우선순위를 가지게 되며
이는 super()를 사용해 명확하게 확인하실 수 있습니다.
이렇게 되면 Generic의 부모가 Robot이 되어버리는데
Robot클래스는 선언부에서 Generic을 상속받고 있습니다.
따라서 Generic의 부모는 Robot이 되는데 Robot의 부모도 Generic이 되어버리는 역설적인 상황이 되며 이에 파이썬이 에러를 뱉어버리는 것입니다.
0






넵 아래와 같습니다.