Menu
Coddy logo textTech

메서드 결정 순서

Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 21번째.

Method Resolution Order (MRO)는 여러 클래스가 동일한 메서드 이름을 가질 때 Python이 메서드를 검색하는 순서입니다.

다음은 동일한 메서드를 가진 여러 클래스가 있는 예시입니다:

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

__mro__를 사용하여 MRO를 확인합니다:

print(C.__mro__)

Output:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

__mro__ 속성은 해동 순서(resolution order)에 있는 모든 클래스를 포함하는 튜플입니다. 첫 번째 요소(__mro__[0])는 항상 클래스 자신(C)이고, 그 뒤를 이어 왼쪽에서 오른쪽 순서로 부모 클래스(A, 그 다음 B), 그리고 마지막으로 내장 object 클래스가 위치합니다.

객체를 생성하고 메서드를 호출합니다:

c = C()
print(c.method())

Output:

Method from A

Python이 MRO의 인덱스 1에서 class A의 method를 first로 찾았으므로 that을 사용했습니다.

상속 순서를 변경하여 차이점을 확인해 보세요:

class D(B, A):  # 이제 B가 A보다 앞에 옵니다
    pass

print(D.__mro__)
d = D()
print(d.method())

Output:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

이제 Python은 상속 목록에서 B가 A보다 먼저 나오기 때문에 B의 메서드를 먼저 찾습니다. 인덱싱을 사용하여 MRO에서 특정 클래스에 접근할 수 있습니다. D.__mro__[0]은 D 자신이고, D.__mro__[1]은 B이며, D.__mro__[2]는 A입니다.

mro() 메서드를 사용할 수도 있습니다:

print(C.mro())

mro()__mro__는 동일한 classes 순서를 제공하지만 타입이 다릅니다: __mro__tuple을 반환하는 반면, mro()list를 반환합니다.

핵심 포인트: Python은 MRO 순서에 따라 메서드를 검색합니다. 먼저 클래스 자체(인덱스 0), 그 다음 클래스 정의에 나열된 순서대로 왼쪽에서 오른쪽으로 부모 클래스들(인덱스 1, 2 등)을 검색합니다. 가장 먼저 발견된 메서드가 사용됩니다.

challenge icon

챌린지

중급

이 챌린지에서는 클래스 계층 구조를 구현합니다.

다음 파일들을 수정해야 합니다:

  • device.py: 기본 Device 클래스를 구현합니다
  • screen.py: Device를 상속받는 Screen 클래스를 구현합니다
  • computer.py: Device를 상속받는 Computer 클래스를 구현합니다
  • laptop.py: 다중 상속을 사용하는 Laptop 클래스를 구현합니다
  • driver.py - 구현이 올바르게 작동하는지 확인할 테스트 케이스를 구현합니다

각 파일에는 구현을 단계별로 안내하는 자세한 TODO 주석이 포함되어 있습니다.

직접 해보기

# TODO: 필요한 모든 클래스 가져오기
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: 주어진 클래스의 MRO (Method Resolution Order) 출력
    # TODO: 형식: "MRO for [class name]:" (참고: 콜론 뒤에 공백 없음)
    # TODO: 클래스 이름을 얻으려면 class_name.__name__ 사용
    # TODO: MRO 튜플을 얻으려면 class_name.__mro__ 사용
    # TODO: MRO의 각 클래스 이름을 별도의 줄에 출력
    
    # TODO: 클래스의 인스턴스 생성
    # TODO: 인스턴스에서 power_on()을 호출하고 결과 저장
    # TODO: Print: "Power on result: [result]"
    # TODO: 가독성을 위해 빈 줄을 출력하세요
    pass


# 코드를 테스트하세요
# TODO: 각 클래스 Device, Screen, Computer, Laptop에 대해 explain_mro()를 호출하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨