• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

클래스 상속 순서? 질문

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

·

답변을 작성해보세요.

2

양념치킨님의 프로필

양념치킨

2022.05.02

지나가다가 우연히 아는 내용이 보이길래 댓글 달아봅니다.
파이썬에서는 mro때문에 상속 순서가 매우 중요합니다.
Generic을 먼저 상속받고 Robot을 상속받는 두 번째 코드는 내부적으로 다음과 같이 처리됩니다.
Siri -> Generic(Siri의 부모) -> Robot(Generic의 부모)
먼저 상속받는 클래스가 높은 우선순위를 가지게 되며
이는 super()를 사용해 명확하게 확인하실 수 있습니다.
이렇게 되면 Generic의 부모가 Robot이 되어버리는데
Robot클래스는 선언부에서 Generic을 상속받고 있습니다.
따라서 Generic의 부모는 Robot이 되는데 Robot의 부모도 Generic이 되어버리는 역설적인 상황이 되며 이에 파이썬이 에러를 뱉어버리는 것입니다.

 

 

0

해당 문제는

A가 AA를 상속받았을 경우

B가 A와 AA를 모두 상속 받았을때 발생하는 문제입니다.

혹시 에러가 발생한 전체 코드를 보여주실 수 있을까요?

bugi님의 프로필

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)