프로그래밍/PYTHON

python - Mixin

aiemag 2021. 3. 13. 00:49
반응형

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

 

결과

 

 

 

 

 

 

 

 

 

반응형