[Python] 추상 클래스

강버섯·2021년 12월 30일
0

FAST API⚡️

목록 보기
1/5

👉 추상 클래스?

메서드 목록만 존재하는 클래스로 상속 받은 클래스에서 메소드 구현을 하도록 하기 위해 사용한다.
추상화를 사용하면 코드의 재사용성이 향상되고 가독성이 향상될 수 있다.

👉 python에서 제공하는 추상 베이스 클래스 기반 구조

python에서는 추상 베이스 클래스(ABC, Abstract Base Class)를 정의하기 위한 기반 구조를 제공해준다.
abc 모듈을 통해서 이 작업이 가능한데,

  1. ABC 클래스의 상속
  2. metaclass로 ABCMeta를 등록

의 두가지 방법이 존재하길래 둘의 차이점이 무엇인지 궁금해졌다.

✏️ ABC

from abc import ABC

class AbstractClass(ABC):

	def abstract_method():
    		pass
  • ABCMeta를 메타 클래스로 가지는 도우미 클래스
  • 간단하게 ABC 파생을 통해 추상 클래스 구현 가능
  • 다중 상속으로 인해 메타 클래스 충돌이 일어날 수 있으므로 주의 필요

✏️ ABCMeta

from abc import ABCMeta

class AbstractClass(metaclass=ABCMeta):

	def abstract_method():
    		pass
  • 추상 베이스 클래스(ABC)를 정의하기 위한 메타 클래스
  • 추상 베이스 클래스에 'metaclass=ABCMeta'로 메타 클래스 지정을 통해 추상 클래스를 생성

👉 차이점

사용하는 방법 외에는 크게 차이가 없는 듯하다.
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
를 사용할 수 있다.

profile
무럭무럭 버섯농장

0개의 댓글