Menu
Coddy logo textTech

메서드 결정 순서

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

메서드 결정 순서(MRO)는 여러 클래스에 동일한 메서드 이름이 있을 때 파이썬이 메서드를 찾기 위해 사용하는 순서입니다.

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

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__)

출력:

(<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())

출력:

Method from A

Python은 클래스 A에서 메서드를 먼저 찾았으므로(MRO의 인덱스 1), 해당 메서드를 사용했습니다.

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

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

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

출력:

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

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

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

print(C.mro())

이것은 __mro__와 동일한 결과를 제공하지만 리스트 형태입니다.

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

challenge icon

챌린지

중급

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

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

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

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

치트 시트

메서드 결정 순서(Method Resolution Order, MRO)는 여러 클래스에 동일한 이름의 메서드가 있을 때 파이썬이 메서드를 찾는 순서입니다.

__mro__ 또는 mro()를 사용하여 MRO를 확인합니다:

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

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

class C(A, B):
    pass

print(C.__mro__)
print(C.mro())  # Same result as a list

파이썬은 MRO 순서에 따라 메서드를 검색합니다. 먼저 클래스 자신을 확인한 다음, 클래스 정의에 나열된 순서대로 왼쪽에서 오른쪽으로 부모 클래스를 확인합니다:

c = C()
print(c.method())  # "Method from A" - A comes before B

class D(B, A):  # B comes before A now
    pass

d = D()
print(d.method())  # "Method from B" - B comes before A

직접 해보기

# 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: class_name.__mro__를 사용하여 MRO 튜플 가져오기
    # TODO: MRO의 각 클래스 이름을 별도의 줄에 출력하기
    
    # TODO: 클래스의 인스턴스 생성하기
    # TODO: 인스턴스에서 power_on()을 호출하고 결과를 저장하기
    # TODO: 출력: "Power on result: [result]"
    # TODO: 가독성을 위해 빈 줄 출력하기
    pass


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

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

Object Oriented Programming의 모든 레슨