본문 바로가기
Python

Duck Typing

by Deeppago 2022. 2. 17.

1. Ducl Typing 이란?

Duck typing이란 특히 동적 타입을 가지는 프로그래밍 언어에서 많이 사용되는 개념으로, 객체의 실제 타입보다는 객체의 변수와 메소드가 그 객체의 적합성을 결정하는 것을 의미한다. Duck typing이라는 용어는 흔히 duck test라고 불리는 한 구절에서 유래됐다.

 

If it walks like a duck and it quacks like a duck, then it must be a duck.
만일 그 새가 오리처럼 걷고, 오리처럼 꽥꽥거린다면 그 새는 오리일 것이다.

 

동적 타입 언어인 파이썬은 메소드 호출이나 변수 접근시 타입 검사를 하지 않으므로 duck typing을 넒은 범위에서 활용할 수 있다. 다음은 간단한 duck typing의 예시다.

 

class Parrot:
    def fly(self):
        print("Parrot flying")

class Airplane:
    def fly(self):
        print("Airplane flying")

class Whale:
    def swim(self):
        print("Whale swimming")

def lift_off(entity):
    entity.fly()

parrot = Parrot()
airplane = Airplane()
whale = Whale()

lift_off(parrot) # prints `Parrot flying`
lift_off(airplane) # prints `Airplane flying`
lift_off(whale) # Throws the error `'Whale' object has no attribute 'fly'`

 

  • https://en.wikipedia.org/wiki/Duck_typing 예제 코드를 발췌하였다.
  • Parrot 클래스와 Airplane 클래스는 분명 서로 상속되거나 하는 그런 관계는 없다, 다만 내부에 동일한 메소드의 fly()메소드가 있는 것만으로 호출하는 `lift_off(entity)' 함수에서 fly가 정상적으로 실행된다.
  • 마지막 Whale 클래스는 해당 fly() 메소드가 없기 때문에, AttributeError가 발생한다.
  • 속성과 메소드 존재에 의해 객체의 적합성이 결정된다.

Python에서는 다양한 곳에서 duck typing을 활용한다. __len__()을 구현하여 길이가 있는 무언가 를 표현한다던지 (흔히 listy하다고 표현한다), 또는 __iter__()  __getitem__() 을 구현하여 iterable을 duck-typing한다. 굳이 Iterable (가명) 이라는 interface를 상속받지 않고 __iter__()와 __getitem__()을 구현하기만 하면 for ... in 에서 바로 사용할 수 있다.

이와 같은 방식은 일반적으로 interface를 구현하거나 클래스를 상속하는 방식으로 인자나 변수의 적합성을 runtime 이전에 판단하는 정적 타입 언어들과 비교된다.

 


참고 자료

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Python#Duck-Typing

https://wikidocs.net/16076

 

'Python' 카테고리의 다른 글

Passed-By-Assignment  (0) 2022.02.18
property (함수/데코레이터)[파이썬/python]  (0) 2022.02.17
메모리 누수[파이썬/python]  (0) 2022.02.17
GC(Garbage Collection)  (0) 2022.02.16
GIL(Global Interpreter Lock)  (0) 2022.02.16

댓글