다중 상속

Python SELF KO
레벨 16 , 레슨 4
사용 가능

10.1 여러 클래스에서 상속받기

다중 상속은 Python에서 클래스가 여러 부모 클래스로부터 속성과 메소드를 상속받을 수 있게 해. 이렇게 하면 코드를 재사용할 수 있는 유연성이 커지지만, 복잡한 계층 구조와 잠재적인 충돌을 유발할 수 있어.

클래스에 다섯 개의 부모를 나열할 수 있는 기능은 네 가능성을 크게 확장시켜줘서 코드를 작성하는 것이 매우 편리해져. 이걸 하는 건 정말 쉬워 — 부모 클래스를 콤마로 구분해서 나열하면 돼:


class Base1:
    def method1(self):
        print("Method1 from Base1")
        
class Base2:
    def method2(self):
        print("Method2 from Base2")
        
class Derived(Base1, Base2):
    pass
        
obj = Derived()
obj.method1()
obj.method2()     
        

모든 것이 계획대로 작동해 — 아름다워.

그러나 다중 상속에는 사용 시 반드시 고려해야 할 몇 가지 복잡한 면이 있어. 어떻게 작동하는지 그리고 다중 상속과 관련된 문제를 피하는 방법을 함께 살펴보자.

10.2 여러 기본 클래스에 있는 메서드 호출

클래스는 이름 뒤에 괄호로 나열된 여러 부모 클래스에서 속성과 메소드를 상속받을 수 있어. 이 속성과 메소드들은 동일한 이름을 가질 수 있어:


class Base1:
    def method(self):
        print("Method from Base1")
        
class Base2:
    def method(self):
        print("Method from Base2")
        
class Derived(Base1, Base2):
    pass
        

obj = Derived()
obj.method() # 여기서 어떤 메소드가 호출될까?
        

이 예제에서 Derived 클래스는 Base1Base2에서 상속받아. method()가 호출되면, Python은 첫 번째로 지정된 클래스의 메서드를 선택해 — Base1.

하지만 그게 그렇게 자명하지는 않아, 그렇지? 그리고 만약 누군가가 기본 클래스의 코드를 변경하면, 애플리케이션의 전체 로직이 영향을 받을 수 있고 네가 어딘가가 잘못되었다는 것을 알지 못할 수도 있어. 그냥 조금 다른 메소드들이 호출되기 시작할 뿐이야 :)

10.3 다중 상속에서 super() 사용

또 다른 흥미로운 점은 다중 상속에서 기본 클래스에 super()를 호출하는 거야.

예제:


class Base1:
    def method(self):
        print("Method from Base1")
        super().method()
        
class Base2:
    def method(self):
        print("Method from Base2")
        super().method()
        
class Derived(Base1, Base2):
    def method(self):
        print("Method from Derived")
        super().method()
         

obj = Derived()
obj.method()
        

자, 화면에 어떤 결과가 출력될까?

Method from Derived
Method from Base1

아니면

Method from Derived
Method from Base2 

서프라이즈 — 출력은 이렇게 나올 거야:

Method from Derived
Method from Base1
Method from Base2

super().method()는 각 기본 클래스의 method()를 호출할 거야! 이게 내가 다중 상속에 대해 처음 언급했을 때 말했던 그런 미묘한 차이점들이야.

10.4 다이아몬드 (Diamond) 상속

마지막으로, 다이아몬드 상속이라는 고전적인 문제. 이건 설명하는 것보다 예제로 보여주는 게 더 쉬워:

이 코드로는 예를 들어 이렇게 보일 수 있어:


class A:
    def method(self):
        print("Method from A")
        
class B(A):
    def method(self):
        print("Method from B")
        super().method()
        
class C(A):
    def method(self):
        print("Method from C")
        super().method()
        
class D(B, C):
    def method(self):
        print("Method from D")
        super().method()
         
         
        
obj = D()
obj.method()
        

출력은 이렇게 될 거야:

Method from D
Method from B
Method from C
Method from A 

다중 상속에서 방향을 잃지 않으려면 Python이 부모 클래스에서 필드와 메소드를 검색하는 순서를 잘 알아야 해. 다음 강의에서 그 내용에 대해 알게 될 거야.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION