Python에서 Mixin 개념을 정리합니다.
Mixin
네 이렇게 섞는 겁니다.. (포스팅에서는 python class code를 Mixin합니다.)
Definition
Mixin은 OOP 프로그래밍 개념으로 특정 클래스의 코드를 다른 클래스에 삽입(혼합) 할 수 있도록 합니다.
Python에서는 다중 상속 문법으로 Mixin을 구현합니다.
개념적으로 Mixin 클래스는 부모클래스가 되지 않으면서 어떤 클래스에서 사용할 수 있는 메소드를 포함하는 클래스입니다.
다시 한번, Mixin은 상속의 개념으로 쓰는 것이 아니라 끼워넣는 개념에 가깝습니다.
Charateristic
1. Mixin 할 때, 동일한 속성 및 메소드는 Overriding이 됩니다.
Python 에서 다음처럼 다중 상속을 하면
1 2 | class Foo(C, B, A): pass | cs |
class Foo는 class C, B, A 의 속성 및 메소드를 상속 받습니다.
이 때 Mixin 처리될 class가 있으면 (A->b->C 순으로) Mixin 됩니다.
이 때 class C, B, A 에 동일한 속성이나 메소드가 있다면 가장 오른쪽(class A)부터 -> 왼쪽(class C) 순으로 overriding 됩니다.
2. Python에서는 다중 상속을 통해 Mixin을 구현합니다.
정확히는, Mixin될 class에서 Mixin자원을 미리 구현해놓고, 다중 상속 문법을 통해 이를 지원되도록 합니다.
이 방식으로 인해 장점은 다형성(polymorphism)을 구현 할 수 있고, 단점은 Mixin class를 미리 땡겨? 구현하는 형태이므로 가독성이 떨어질 수 있습니다.
좋게 표현하면 Mixin interface를 가져다 쓸 수 있는 방식이 됩니다.
3. Mixin 으로 OOP의 다형성(Polymorphism) 구현이 가능합니다.
다음에서 Mixin calss가 A, B 이고 class C에 Mixin을 합니다.
상황에 따라, class C에 class A 또는 class B를 Mixin 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class A: def showCommon(self): print("common A") class B: def showCommon(self): print("common B") class C: def showC(self): print("C") self.showCommon() class Foo1(C, B): pass class Foo2(C, A): pass foo1 = Foo1() foo1.showC() foo2 = Foo2() foo2.showC() | cs |
Code
Mixin Example 전체 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #!/usr/bin/python3 class A: var_common = 'A' def showCommon(self): print("common A") def showA(self): print("A") class B: var_common = 'B' def showCommon(self): print("common B") def showB(self): print("B") class C: def showC(self): print("C") self.showCommon() # Mixin - Overriding def process1(): print('\n##### Overriding #####') class Foo(B, A): pass foo = Foo() foo.showCommon() print(foo.var_common) # Mixin - Polymorphism def process2(): print('\n##### Polymorphism #####') class Foo1(C, B): pass class Foo2(C, A): pass foo1 = Foo1() foo1.showC() foo2 = Foo2() foo2.showC() def main(): process1() process2() if __name__ == "__main__": main() | cs |
결과
'프로그래밍 > PYTHON' 카테고리의 다른 글
python - Pandas Dataframe Handling(Creation, Filtering, Translation) (0) | 2021.02.22 |
---|---|
python - Equality, Identity (0) | 2021.02.12 |
python - Comprehension, Generator expression (0) | 2021.02.11 |
python - Yield, Generator (0) | 2021.02.10 |
[환경설정] python - Linux anaconda (0) | 2021.02.10 |