inflearn logo
강의

講義

知識共有

タイプPython!正しいクラスの使い方とオブジェクト指向プログラミング

Generic Types & The End...

클래스 상속 순서? 질문

378

bugi

投稿した質問数 4

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'>]

python oop

回答 2

2

ikarte6668758

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

 

 

0

amamov

해당 문제는

A가 AA를 상속받았을 경우

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

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

0

bugi

넵 아래와 같습니다.

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)

보너스 챕터 마지막 강의 녹화 품질이 문제가 있습니다ㅠㅠ

0

110

1

린터 설치문의

0

362

2

데이터분석에서의 가상환경

0

395

0

print(Robot.how_many()) 하면 None이 뜨는 이유

2

325

2

타입파이썬 문의

1

333

1

프레임워크 질문

1

234

1

문수미님과 같은 내용입니다

1

309

1

pip과pip3의 차이

1

2727

1

메서드 리턴 값이 print일 때 print를 찍으면 None

1

247

1

변수의 참조에 대해서 질문입니다.

1

242

1

질문입니다..

1

201

1

pyright 를 이용한 클래스 재정의 코드 실행 문제점 질문 드립니다.

1

445

1

which pyhon이 왜 안될까요..?

1

435

1

pyright 에러나서 질문드립니다.

1

392

1

클래스 변수 관련 질문입니다.

1

296

1

데코레이터 관련 질문

1

223

1

venv 로 만든 가상환경은 파이썬 버젼을 변경하기가 어려운 것 같습니다.

1

1108

1

Final로 타이핑한 변수에 list를 넣는다면

1

225

1

생성자에서 자기 자신 타이핑 하는 경우

1

217

1

f"{객체}" 출력값에서의 숫자값과 id(객체)에서의 숫자값의 차이가 무엇인가요??

1

331

1

타입힌트 실무에서 자주쓰이나요?

2

478

1

스태틱메소드와 클래스메소드

3

261

1

인스턴스와 데이터

2

232

1

call method 관련 질문입니다!

1

188

1