Q & A
덕 타이핑이란 무엇인가요?
덕 타이핑은 실제 타입(클래스)은 상관하지 않고, 구현된 메서드로만 판단하는 방식입니다. 덕 타이핑은 "만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라 부르겠다."라는 덕 테스트(오리 테스트)에서 유래한 말입니다.
다음과 같이 in_the_forest 함수는 객체에 quack 메서드와 feathers 메서드만 있으면 함수를 호출할 수 있습니다. 즉, 객체에 quack 메서드와 feathers 메서드가 있으면 오리 타입으로 간주하는 방식입니다.
class Duck: # 오리 클래스를 만들고 quack과 feathers 메서드 정의 def quack(self): print('꽥~!') def feathers(self): print('오리는 흰색과 회색 털을 가지고 있습니다.') class Person: # 사람 클래스를 만들고 quack과 feathers 메서드 정의 def quack(self): print('사람은 오리를 흉내냅니다. 꽥~!') def feathers(self): print('사람은 땅에서 깃털을 주워서 보여줍니다.') def in_the_forest(duck): # 덕 타이핑을 사용하는 함수. 클래스의 종류는 상관하지 않음 duck.quack() # quack 메서드와 duck.feathers() # feathers 메서드만 있으면 함수를 호출할 수 있음 donald = Duck() # 오리 클래스로 donald 인스턴스를 만듦 james = Person() # 사람 클래스로 james 인스턴스를 만듦 in_the_forest(donald) # in_the_forest에 오리 클래스의 인스턴스 donald를 넣음 in_the_forest(james) # in_the_forest에 사람 클래스의 인스턴스 james를 넣음
실행 결과
꽥~! 오리는 흰색과 회색 털을 가지고 있습니다. 사람은 오리를 흉내냅니다. 꽥~! 사람은 땅에서 깃털을 주워서 보여줍니다.
믹스인이란 무엇인가요?
믹스인(mix-in)은 다른 클래스에서 사용할 수 있도록 공통적인 메서드를 모아 놓은 클래스를 말합니다. 파이썬에서 믹스인은 자체 인스턴스 속성을 가지고 있지 않으며 __init__ 메서드를 구현하지 않습니다. 예를 들어 인사하는 메서드 greeting은 사람 종류의 클래스에서 공통적으로 사용하는 메서드이며 HelloMixIn에 넣었습니다. Student는 HelloMixIn과 Person을 상속받고, Teacher도 HelloMixIn과 Person을 상속받았습니다. 따라서 Student와 Teacher는 모두 공통 메서드인 greeting을 사용할 수 있습니다.
class HelloMixIn: def greeting(self): # 인사하는 메서드는 공통적인 메서드 print('안녕하세요.') class Person(): def __init__(self, name): self.name = name class Student(HelloMixIn, Person): # HelloMixIn과 Person을 상속받아 학생 클래스를 만듦 def study(self): print('공부하기') class Teacher(HelloMixIn, Person): # HelloMixIn과 Person을 상속받아 선생님 클래스를 만듦 def teach(self): print('가르치기')
믹스인의 실제 사용 예는 파이썬 내장 모듈 socketserver를 참조하기 바랍니다.
Lib/socketserver.py
class ForkingUDPServer(ForkingMixIn, UDPServer): pass class ForkingTCPServer(ForkingMixIn, TCPServer): pass class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
간단하게 설명하자면 ForkingMixIn은 포크(리눅스/유닉스에서 자식 프로세스를 생성) 방식을 구현한 믹스인이고, ThreadingMixIn은 스레드 방식을 구현한 믹스인입니다. 즉, 이 믹스인과 UDP 프로토콜 서버인 UDPServer, TCP 프로토콜 서버인 TCPServer를 상속받아 ForkingUDPServer, ForkingTCPServer, ThreadingUDPServer, ThreadingTCPServer 네 종류의 클래스를 만든다는 뜻입니다.