클래스에서 제공해야 하는 추가적인 메소드만 정의하는 작은 클래스
인스턴스 속성을 정의하지 않으며 __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
다른 클래스의 일부 기능을 그대로 이용하고 싶으나, 전체 기능 상속은 피하고 싶을 때 사용
상속 관계가 복잡할 경우 코드 이해가 어려운 경우가 많음
예시
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/