메서드 결정 순서
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 APython은 클래스 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 등). 가장 먼저 발견된 메서드가 사용됩니다.
챌린지
중급이 챌린지에서는 클래스 계층 구조를 구현합니다.
다음 파일들을 수정해야 합니다:
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() 호출하기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.