Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 트라이
- 티스토리
- 튜플
- trie
- Spring Boot
- pycon
- 카카오 인턴
- bulk update
- Python
- 불량 사용자
- 가사 검색
- 트라이 #trie #알고리즘
- 알고리즘
- 크레인 인형뽑기 게임
- Tistory
- 티스토리 open api
- 징검다리 건너기
- 프로그래머스
- 보행자 천국
- Open API
- jdbc
- 호텔 방 배정
- CleanCode
Archives
- Today
- Total
택시짱의 개발 노트
mro(method resolution order)가 뭐지..? 본문
mro 란?
method resolution order로 메서드 결정 순서이다. ( 자식과 부모 클래스를 전부 포함하여 메서드의 실행 순서를 지정하는 것)
왜 mro라는게 있을까?
python은 기본적으로 다중 상속을 지원한다.
상속받은 부모 클래스가 서로 겹치지 않은 메서드 네임을 가지고 있다면 자식 클래스에서 부모 클래스의 메서드를 사용할때 딱히 문제가 되지 않는데 BUT 부모 클래스가 가지고 있는 메서드의 이름이 모두 같다면 자식 클래스는 어떤 부모 클래스의 메서드를 불러와야할까??
아래의 같은 경우에는 어떻게 해야 될까..??
정답은 자식에서 상속 받기 위해 작성한 부모 클래스의 순서에 있다. (왼쪽에서 오른쪽으로)
class A:
def name(self):
print('A')
class B:
def name(self):
print('B')
class C:
def name(self):
print('C')
class D(A, B, C):
pass
d = D()
d.name()
print(C.__mro__)
>>> A
>>> (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
현재 C라는 자식 클래스는 왼쪽을 시작으로 A, B, C 부모 클래스를 상속 받고 있다.
그래서 d.name()을 호출하면 A가 출력되고 있고
여기서 현재 클래스의 mro를 확인하는 방법은 클래스.__mro__를 호출하면 된다.
그래서 print(C.__mro__)는 위와 같이 D, A, B , C, object가 나오는것을 확인할 수 있다.
이때 A의 name 메서드를 삭제하면 어떻게 될까?
class A:
# def name(self):
# print('A')
pass
class B:
def name(self):
print('B')
class C:
def name(self):
print('C')
class D(A, B, C):
pass
d = D()
d.name()
>>> B
>>> (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
A의 name 메서드를 삭제하게 되면 mro의 다음 순서에 있는 클래스에서 name 메서드를 찾게 된다.
그래서 d.name()은 B를 출력하게 된다!!
상속을 할때 주의 해야하는 부분도 있다. 아래와 같은 경우에는 error가 발생하기도 한다.
class A:
def name(self):
print('A')
class B(A):
def name(self):
print('B')
class C(A):
def name(self):
print('C')
class D(A, B, C):
pass
d = D()
d.name()
Error발생
TypeError: Cannot create a consistent method resolution
order (MRO) for bases A, B, C
A는 B와 C의 부모 클래스 이다. mro순서로 보면 B와 C가 A보다 먼저 있는데
D에서 A, B, C 순서로 상속을 받게되면 B, C에서 A를 상속 받았기 때문에 상속 순서에 대한 문제가 발생하게 된다.
반응형
'python' 카테고리의 다른 글
python 코루틴이란? (0) | 2022.03.23 |
---|---|
python decorator의 실행 순서는 어떻게? (2) | 2022.02.20 |
classmethod vs staticmethod (0) | 2022.01.16 |
pycon - 우아하게 준비하는 테스트와 리팩토링 ( 테스트 ) (0) | 2021.07.25 |
pycon - 우아하게 준비하는 테스트와 리팩토링 ( 클린코드 ) (0) | 2021.07.24 |
Comments