최근 디자인 패턴을 공부하면서 Java언어의 예제를 자주 접하다 보니 파이썬에도 추상 클래스와 인터페이스에 대한 개념이 있지 않을까 해서 관련 정보를 찾아보고 정리하였다. 그중에 나온 개념이 파이썬에서 사용하는 추상클래스와 덕 타이핑이라는 개념인데 이를 공부하고 정리해 보았다.
추상 클래스
파이썬은 추상 클래스(abstract class)를 제공한다. 추상 클래스란 구현 내용이 없고 메서드 목록만 가진 클래스이다. 추상클래스 자체로는 인스턴스화가 불가능하며, 클래스의 메서드를 상속받는 파생 클래스에게 구현하도록 강제하기 위해 사용된다.
파이선에서 추상 클래스를 사용하기 위해서는 ABC클래스와 @abstractmethod을 임포트 하여야 한다.
from abc import *
class 추상클래스명(metaclass=ABCMeta):
@abstractmethod
def 추상메소드(self):
pass
추상 메서드는 생략하면 기본적인 클래스는 동작하지만, 추상 메서드를 추가한 후에 객체를 생성하면 에러가 발생한다.
아래는 추상 메서드를 구현하지 않았을 때 나온 예제이다.
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('공부하기')
james = Student()
james.study()
===================
Traceback (most recent call last):
File "C:\project\class_abc_error.py", line 16, in <module>
james = Student()
TypeError: Can't instantiate abstract class Student with abstract methods go_to_school
추상 클래스를 상속받았다면 @abstractmethod가 붙은 추상 메서드를 모두 구현하여야 한다. 따라서 아래와 같이 Student에서 go_to_school 메서드를 구현하여야 한다.
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('공부하기')
def go_to_school(self):
print('학교가기')
james = Student()
james.study()
james.go_to_school()
덕 타이핑
'If it walks like a duck and it quacks like a duck, then it must be a duck' 해석해 보면 '오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 틀림없이 오리다.'라는 뜻이다. 파이썬과 같은 동적 타입의 언어에서는 본질적으로 다른 클래스라도 객체의 적합성은 객체의 실제 유형이 아닌 특정 메서드와 속성의 존재에 의해 결정되는 것을 의미한다.
아래는 덕 타이핑에 대한 예제이다.
class Duck():
def sound(self):
print('꽥꽥')
class Dog():
def sound(self):
print('멍멍')
class Fish():
def swim(self):
print('헤엄')
def get_sound(animal):
animal.sound()
duck = Duck()
dog = Dog()
fish = Fish()
get_sound(duck) # 꽥꽥
get_sound(dog) # 멍멍
get_sound(fish) # 에러발생! (AttributeError)
클래스 내부에 동일한 메서드가 있는 것만으로 get_sound에서 정상적으로 호출되는 것을 볼 수 있으며, Fish 같은 경우에는 메서드가 존재하지 않기 때문에 AttributeError가 발생한다. 즉 속성과 메서드의 존재에 의해 객체의 적합성이 결정된다고 볼 수 있다.
참고
https://nesoy.github.io/articles/2018-02/Duck-Typing
'Programing Language > Python' 카테고리의 다른 글
코드 포맷터의 의미와 파이참에서 Black으로 코드 스타일 자동화 하기 (2) | 2023.11.23 |
---|---|
pyautogui을 이용하여 자동화 기능 만들기 (1) | 2023.10.28 |
requests 기본 동작 방식과 session() (0) | 2023.09.03 |
openpyxl로 엑셀 데이터 다루기 (0) | 2023.08.20 |
Selenium과 Pyinstaller를 이용하여 만든 실행파일 뒤에 검은창이 나올 경우 해결 방법 (0) | 2023.07.06 |