메서드 목록만 존재하는 클래스로 상속 받은 클래스에서 메소드 구현을 하도록 하기 위해 사용한다.
추상화를 사용하면 코드의 재사용성이 향상되고 가독성이 향상될 수 있다.
python에서는 추상 베이스 클래스(ABC, Abstract Base Class)를 정의하기 위한 기반 구조를 제공해준다.
abc 모듈을 통해서 이 작업이 가능한데,
의 두가지 방법이 존재하길래 둘의 차이점이 무엇인지 궁금해졌다.
from abc import ABC
class AbstractClass(ABC):
def abstract_method():
pass
from abc import ABCMeta
class AbstractClass(metaclass=ABCMeta):
def abstract_method():
pass
사용하는 방법 외에는 크게 차이가 없는 듯하다.
ABC는 ABCMeta에 추가 레이어를 올려 사용할 추상 클래스를 미리 정의해 놓았다는 것.
ABC를 사용할 경우 간단히 상속을 통해서 추상 클래스를 구현할 수 있지만 다중 상속으로 인한 메타 클래스 충돌을 주의해야하고, ABCMeta를 사용할 경우 metaclass=ABCMeta로 지정을 해준다는 점의 차의 정도로 보인다.
이외의 기능적인 측면에서는 동일한 것으로 보인다.
from abc import ABCMeta, abstractmethod
class AbstractClass(metaclass=ABCMeta):
#추상 클래스의 메소드는 호출될 일이 없기 때문에 pass로 작성
@abstractmethod
def abstract_method1():
pass
def abstract_method2():
raise NotImplementedError
class ChildClass(AbstractClass):
def abstract_method1():
print("abstract_method1")
def abstract_method2():
print("abstract_method2")
추상 클래스에 정의된 메소드들은 직접 호출될 일이 없기 때문에 상속 받아 사용할 클래스에서 메소드를 정의한다.
오로지 메소드의 목록만을 가지고 있기 때문에, 상속 받은 클래스에서는 반드시 해당 메소드들을 구현해야만 한다.
메소드의 구현을 강제하기 위해서
1. @abstractmethod
2. raise NotImplementedError
를 사용할 수 있다.