0Pricing
Python Academy · 강의

다중 상속과 MRO

다중 상속과 Python의 MRO(C3 선형화)를 이해합니다.

다중 상속과 MRO은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

소개

Python은 다중 상속을 지원합니다. 메서드 해석 순서(MRO)는 이름이 충돌할 때 어떤 메서드가 호출되는지 결정합니다.

다중 상속 문법

class C(A, B):는 A와 B를 모두 상속합니다. C는 두 클래스의 모든 메서드를 얻습니다.
class A:
    def hello(self): return 'A'
class B:
    def world(self): return 'B'
class C(A, B): pass
c = C()
print(c.hello(), c.world())

메서드 해석 순서(MRO)

MRO는 조회 순서를 정의합니다. C.__mro__는 C, A, B, object라는 순서를 보여 줍니다. 일치하는 메서드가 있는 첫 번째 클래스가 선택됩니다.
class A:
    def greet(self): return 'A'
class B:
    def greet(self): return 'B'
class C(A, B): pass
print(C().greet())  # A wins
print(C.__mro__)

C3 선형화

Python은 C3 선형화를 사용하여 MRO를 계산합니다. C3는 자식 클래스가 부모 클래스보다 먼저 오고, 여러 부모 클래스에서는 왼쪽에서 오른쪽 순서를 따르도록 보장합니다.
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print([c.__name__ for c in D.__mro__])

다이아몬드 상속

B와 C가 모두 A를 상속하는 D(B,C)는 다이아몬드 문제가 됩니다. C3는 A의 __init__이 한 번만 호출되도록 보장합니다.
class A:
    def __init__(self): print('A')
class B(A):
    def __init__(self): super().__init__(); print('B')
class C(A):
    def __init__(self): super().__init__(); print('C')
class D(B, C):
    def __init__(self): super().__init__(); print('D')
D()

믹스인

믹스인은 다중 상속을 위해 설계된 클래스입니다. 완전한 독립 클래스 역할을 하지 않고 메서드를 추가합니다.
class JSONMixin:
    def to_json(self):
        import json
        return json.dumps(vars(self))
class User(JSONMixin):
    def __init__(self, name, age): self.name,self.age=name,age
print(User('Alice', 30).to_json())

믹스인 설계 규칙

믹스인은 __init__을 가지지 않고, 믹스인이 아닌 클래스에서 상속하지 않으며, 한 가지 일만 해야 합니다. 이름에는 Mixin 접미사를 사용하세요.
class LoggingMixin:
    def log(self, msg): print(f'[{self.__class__.__name__}] {msg}')
class Service(LoggingMixin):
    def run(self): self.log('running')
Service().run()

다중 상속에서 super() 사용하기

super()는 반드시 직접 부모 클래스가 아니라 MRO에서 다음 클래스의 메서드를 호출합니다. 협력적 동작을 위해 각 클래스가 super()를 호출해야 합니다.
class Base:
    def action(self): return 'Base'
class A(Base):
    def action(self): return 'A->' + super().action()
class B(Base):
    def action(self): return 'B->' + super().action()
class C(A, B):
    def action(self): return 'C->' + super().action()
print(C().action())

동적 클래스 생성을 위한 type()

type('NewClass', (Base,), {'method': fn})은 클래스를 동적으로 생성합니다. 메타프로그래밍에 유용합니다.
def hello(self): return 'hello'
MyClass = type('MyClass', (object,), {'hello': hello})
print(MyClass().hello())

MRO 확인하기

ClassName.__mro__ 또는 inspect.getmro(ClassName)은 클래스들의 튜플로 해석 순서를 보여 줍니다.
class A: pass
class B(A): pass
class C(B): pass
import inspect
print([c.__name__ for c in inspect.getmro(C)])

다중 상속을 피해야 할 경우

복잡한 다중 상속 계층 구조는 이해하고 추적하기 어렵습니다. 깊은 계층 구조보다는 컴포지션이나 단순한 믹스인을 사용하세요.
# Prefer:
class User:
    def __init__(self, name, logger):
        self.name = name
        self.logger = logger  # composition
print('composition preferred')

빠른 확인

파이썬은 메서드 결정 순서를 계산할 때 어떤 알고리즘을 사용합니까?

복습

다중 상속: class C(A, B). MRO는 C3 선형화를 통해 메서드 조회 순서를 결정합니다. 깔끔한 다중 상속을 위해 믹스인을 사용하십시오. super()는 MRO를 따릅니다.

계속하기

훌륭하게 진행하고 계십니다! 다음 개념을 완전히 익힐 때까지 계속 학습하십시오.

자주 묻는 질문

“다중 상속과 MRO” 강의는 무료인가요?

네 — “다중 상속과 MRO” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“다중 상속과 MRO”에서 뭘 배우나요?

다중 상속과 Python의 MRO(C3 선형화)를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Python Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“다중 상속과 MRO” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 단일 상속
  2. 메서드 오버라이딩과 super()
  3. 다중 상속과 MRO
  4. 다형성과 덕 타이핑
← Python Academy(으)로 돌아가기