메서드 결정 순서 (MRO) 이해
이 단계에서는 Python 의 메서드 결정 순서 (MRO) 에 대해 배우게 됩니다. MRO 는 Python 이 클래스 계층 구조에서 메서드를 검색하는 순서입니다. 다중 상속을 다룰 때 특히 중요합니다.
MRO 를 설명하기 위해 새로운 클래스 집합을 만들어 보겠습니다. VS Code 편집기를 사용하여 ~/project 디렉토리에 animal.py라는 파일을 생성합니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
animal.py 파일을 저장합니다.
이제 MRO 를 보여주기 위해 ~/project 디렉토리에 mro_example.py라는 새 파일을 생성합니다.
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
mro_example.py 파일을 저장합니다.
이 예에서:
Animal은 speak 메서드를 가진 기본 클래스입니다.
Mammal은 Animal에서 상속받고 speak 메서드를 재정의합니다.
Dog는 Mammal에서 상속받고 speak 메서드를 재정의합니다.
Cat은 Mammal에서 상속받고 speak 메서드를 재정의합니다.
my_dog.speak()를 호출하면 Python 은 먼저 Dog 클래스에서 speak 메서드를 찾습니다. 거기에서 찾을 수 없으면 Mammal 클래스에서 찾고, 그 다음 Animal 클래스에서 찾습니다. 이 순서는 MRO 에 의해 결정됩니다.
mro_example.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python mro_example.py
다음 출력을 볼 수 있습니다.
Woof!
Meow!
이제 다중 상속을 사용한 더 복잡한 예를 살펴보겠습니다. ~/project 디렉토리에 mro_complex.py라는 새 파일을 생성합니다.
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
mro_complex.py 파일을 저장합니다.
이 예에서:
- 클래스
D는 B와 C 모두에서 상속받습니다.
B와 C는 모두 A에서 상속받습니다.
method는 세 클래스 A, B, C 모두에서 정의됩니다.
mro_complex.py 스크립트를 실행하려면 터미널을 열고 ~/project 디렉토리로 이동합니다.
cd ~/project
그런 다음 python 명령을 사용하여 스크립트를 실행합니다.
python mro_complex.py
다음 출력을 볼 수 있습니다.
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
출력 B는 클래스 B의 method가 호출되었음을 나타냅니다. D.mro() 메서드는 클래스 D에 대한 메서드 결정 순서를 나타내는 튜플을 반환합니다. 이 경우 MRO 는 D -> B -> C -> A -> object입니다. 즉, d.method()를 호출하면 Python 은 먼저 클래스 D에서 메서드를 찾고, 그 다음 클래스 B에서, 그 다음 클래스 C에서, 그 다음 클래스 A에서, 마지막으로 기본 클래스 object에서 찾습니다.
MRO 를 이해하는 것은 상속, 특히 다중 상속을 사용할 때 코드의 동작을 예측하는 데 필수적입니다.