관리 메뉴

HAMA 블로그

파이썬에서의 믹스인 (Mixin) 본문

Python

파이썬에서의 믹스인 (Mixin)

[하마] 이승현 (wowlsh93@gmail.com) 2017. 6. 26. 18:26


Python 과 Mixin


파이썬은 다중 상속을 지원하며 그것에 의해 Mixins 를 만들 수 있다. Mixin 은 클래스에 추가적인 속성이나 메소드를 제공하는 것을 말하는데, 스칼라는 traits 를 통해서 제공하며, 루비등도 제공한다. 파이썬은 Mixin 을 위한 특별한 키워드는 없으며, 단지 다중상속을 통해서 만들기 때문에 이 과정에서 문제가 생길 소지가 생긴다. 스칼라의 경우 stackable traits pattern이라고 동일한 메소드가 있을 경우 순서대로 하나씩 실행되지만 파이썬의 경우 덮어 써 버린다. 

다음 예를 살펴보자 

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

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

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

파이썬에서는 오른쪽 부터 왼쪽으로 계승이 되는데, 즉 Mixin2 클래스가 가장 상위클래스가 되고 그 후에 Mixin1 , BaseClass 가 차례대로 하위 클래스가 되는데 일반적인 경우 덮어 써질 염려가 없지만 , 위 처럼 메소드 명이 같을 경우 가장 하위의 클래스가 적용되어 덮어 써진다. 

>>> obj = MyClass()
>>> obj.test()
Mixin1

따라서 -> 이 쪽으로 갈 수록 상위 클래스라는 것을 명심해야 버그를 줄일 수 있을 것이다.

class MyClass(Mixin2, Mixin1, BaseClass):
    pass
>>> obj = MyClass()
>>> obj.test()
Mixin2

개인적으로 상속이나 믹스인보다 컴포지션을 많이 사용한다. 객체지향에 서툴러서 인 걸까? 아니면 먼가 더 달라 붙어있는것을 싫어해서 일까? 대부분의 경우 유연성을 위한 복잡함의 증가로 피부에 와닿았지 훗날의 유지보수에서 득이 되는 경우를 많이 겪어보지 않아서 일까? 물론 is-a , has-a 라는 구분하에 적재적소에 가려 써야 겠지만....말은 참 쉽다. ㅎㅎ


Comments