[Python] 믹스인(Mixin)과 컴포지션(Composition)

cdwde·2021년 5월 22일
0

🎈 믹스인 (Mixin)

  • 클래스에서 제공해야 하는 추가적인 메소드만 정의하는 작은 클래스

  • 인스턴스 속성을 정의하지 않으며 __init__ 생성자를 호출하도록 요구하지 않음

  • 한 클래스에 대해 많은 선택 기능을 제공할 때 사용

  • 많은 다른클래스에서 하나의 특정 기능을 사용하려고 할 때 사용

  • Mixin을 위한 특별한 키워드 X, 다중상속을 통해 만들기 때문에 문제가 생길 수 있음

  • 파이썬의 경우 동일한 메소드가 있을 경우 덮어버림

예시

class Mixin1:
    def test(self):
        print("Mixin1")

class Mixin2:
    def test(self):
        print("Mixin2")

class MyClass(Mixin1, Mixin2):
    pass

print(MyClass.mro())

obj = MyClass()
obj.test()

#출력 결과
#[<class '__main__.MyClass'>, <class '__main__.Mixin1'>, <class '__main__.Mixin2'>, <class 'object'>]
#Mixin1
  • MRO에 따라 Mixin2 -> Mixin1 순으로 계승되는데 메소드 명이 같을 경우 가장 하위클래스가 적용되어 오버라이딩됨

🎈 컴포지션 (Composition)

  • 다른 클래스의 일부 기능을 그대로 이용하고 싶으나, 전체 기능 상속은 피하고 싶을 때 사용

  • 상속 관계가 복잡할 경우 코드 이해가 어려운 경우가 많음

예시
Clac 클래스에서 Cacl2의 multiply() 메서드만 활용하고 싶고 Calc2 전체를 상속받고 싶지는 않음

class Clac:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def add(self):
        return self.x + self.y
    
    def substract(self):
        return self.x - self.y

class Calc2:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def add(self):
        return self.x + self.y
    
    def multiply(self):
        return self.x * self.y

컴포지션 사용

class Clac:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.calc2 = Calc2(x, y)	#해당 클래스의 객체를 명시적으로 가져옴
    
    def add(self):
        return self.x + self.y
    
    def substract(self):
        return self.x - self.y
    
    def multiply(self):
        return self.calc2.multiply()

class Calc2:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def add(self):
        return self.x + self.y
    
    def multiply(self):
        return self.calc2.multiply()   #해당 클래스의 객체에 있는 메서드를 명시적으로 활용

참고
https://blog.kyojs.com/python/2018/08/08/Mixin-and-Composition/

0개의 댓글