-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
클래스 상속 순서? 질문
22.04.13 12:59 작성 조회수 187
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
양념치킨
2022.05.02
지나가다가 우연히 아는 내용이 보이길래 댓글 달아봅니다.
파이썬에서는 mro때문에 상속 순서가 매우 중요합니다.
Generic을 먼저 상속받고 Robot을 상속받는 두 번째 코드는 내부적으로 다음과 같이 처리됩니다.
Siri -> Generic(Siri의 부모) -> Robot(Generic의 부모)
먼저 상속받는 클래스가 높은 우선순위를 가지게 되며
이는 super()를 사용해 명확하게 확인하실 수 있습니다.
이렇게 되면 Generic의 부모가 Robot이 되어버리는데
Robot클래스는 선언부에서 Generic을 상속받고 있습니다.
따라서 Generic의 부모는 Robot이 되는데 Robot의 부모도 Generic이 되어버리는 역설적인 상황이 되며 이에 파이썬이 에러를 뱉어버리는 것입니다.
0
윤상석
지식공유자2022.04.15
해당 문제는
A가 AA를 상속받았을 경우
B가 A와 AA를 모두 상속 받았을때 발생하는 문제입니다.
혹시 에러가 발생한 전체 코드를 보여주실 수 있을까요?
bugi
질문자2022.04.16
넵 아래와 같습니다.
from typing import Generic, Optional, TypeVar, Union
ARM = TypeVar("ARM")
HEAD = TypeVar("HEAD")
class Robot(Generic[ARM, HEAD]):
def __init__(self, arm: ARM, head: HEAD):
self.arm = arm
self.head = head
def decode(self):
# 암호 해석하는 코드라고 가정
bbb: Optional[ARM] = None
pass
class Siri(Robot[ARM, HEAD], Generic[ARM, HEAD]):
pass
siri1 = Siri[int, int](123, 123)
siri2 = Siri[str, int]("1234", 1234)
siri3 = Siri[float, float](12345.1, 12345.1)
print(siri1.arm)
print(Siri.mro())
# 함수에서 사용
def test(x: ARM) -> ARM:
print(x)
print(type(x))
return x
test(898)
답변 2